Android Crop Center Bitmap


Answers

Хотя большинство из приведенных выше ответов предоставляют способ сделать это, уже есть встроенный способ выполнить это, и это 1 строка кода ( ThumbnailUtils.extractThumbnail() )

int dimension = getSquareCropDimensionForBitmap(bitmap);
bitmap = ThumbnailUtils.extractThumbnail(bitmap, dimension, dimension);

...

//I added this method because people keep asking how 
//to calculate the dimensions of the bitmap...see comments below
public int getSquareCropDimensionForBitmap(Bitmap bitmap)
{
    //use the smallest dimension of the image to crop to
    return Math.min(bitmap.getWidth(), bitmap.getHeight());
}

Если вы хотите, чтобы объект растрового изображения был переработан, вы можете передать параметры, которые делают это так:

bitmap = ThumbnailUtils.extractThumbnail(bitmap, dimension, dimension, ThumbnailUtils.OPTIONS_RECYCLE_INPUT);

От: ThumbnailUtils Документация

public static Bitmap extractThumbnail (источник битовой карты, ширина int, int height)

Добавлено в уровень API 8 Создает центрированное растровое изображение нужного размера.

Параметры исходный исходный битмап источник ширина целевая ширина высота целевая высота

Иногда я получал ошибки при использовании принятого ответа, и использование ThumbnailUtils разрешало эти проблемы для меня. Плюс, это намного чище и многоразово.

Question

У меня есть растровые изображения, которые представляют собой квадраты или прямоугольники. Я беру кратчайшую сторону и делаю что-то вроде этого:

int value = 0;
if (bitmap.getHeight() <= bitmap.getWidth()) {
    value = bitmap.getHeight();
} else {
    value = bitmap.getWidth();
}

Bitmap finalBitmap = null;
finalBitmap = Bitmap.createBitmap(bitmap, 0, 0, value, value);

Затем я масштабирую его до 144 x 144 Bitmap, используя это:

Bitmap lastBitmap = null;
lastBitmap = Bitmap.createScaledBitmap(finalBitmap, 144, 144, true);

Проблема в том, что он обрезает верхний левый угол исходного растрового изображения, у любого есть код для обрезки центра растрового изображения?




public static Bitmap resizeAndCropCenter(Bitmap bitmap, int size, boolean recycle) {
    int w = bitmap.getWidth();
    int h = bitmap.getHeight();
    if (w == size && h == size) return bitmap;
    // scale the image so that the shorter side equals to the target;
    // the longer side will be center-cropped.
    float scale = (float) size / Math.min(w,  h);
    Bitmap target = Bitmap.createBitmap(size, size, getConfig(bitmap));
    int width = Math.round(scale * bitmap.getWidth());
    int height = Math.round(scale * bitmap.getHeight());
    Canvas canvas = new Canvas(target);
    canvas.translate((size - width) / 2f, (size - height) / 2f);
    canvas.scale(scale, scale);
    Paint paint = new Paint(Paint.FILTER_BITMAP_FLAG | Paint.DITHER_FLAG);
    canvas.drawBitmap(bitmap, 0, 0, paint);
    if (recycle) bitmap.recycle();
    return target;
}

private static Bitmap.Config getConfig(Bitmap bitmap) {
    Bitmap.Config config = bitmap.getConfig();
    if (config == null) {
        config = Bitmap.Config.ARGB_8888;
    }
    return config;
}



Вы можете использовать следующий код, который может решить вашу проблему.

Matrix matrix = new Matrix();
matrix.postScale(0.5f, 0.5f);
Bitmap croppedBitmap = Bitmap.createBitmap(bitmapOriginal, 100, 100,100, 100, matrix, true);

Выше метод делает postScalling изображения перед обрезкой, поэтому вы можете получить лучший результат с обрезанным изображением без получения ошибки OOM.

Более подробную информацию вы можете найти в этом блоге




Наверное, это самое простое решение:

public static Bitmap cropCenter(Bitmap bmp) {
    int dimension = Math.min(bmp.getWidth(), bmp.getHeight());
    return ThumbnailUtils.extractThumbnail(bmp, dimension, dimension);
}

импорт:

import android.media.ThumbnailUtils;
import java.lang.Math;
import android.graphics.Bitmap;



Links