Android Crop Center Bitmap
У меня есть растровые изображения, которые представляют собой квадраты или прямоугольники. Я беру кратчайшую сторону и делаю что-то вроде этого:
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);
Проблема в том, что он обрезает верхний левый угол исходного растрового изображения. У кого-нибудь есть код для обрезки центра растрового изображения?
Ответы
Ответ 1
![enter image description here]()
Это может быть достигнуто с помощью: Bitmap.createBitmap(источник, x, y, ширина, высота)
if (srcBmp.getWidth() >= srcBmp.getHeight()){
dstBmp = Bitmap.createBitmap(
srcBmp,
srcBmp.getWidth()/2 - srcBmp.getHeight()/2,
0,
srcBmp.getHeight(),
srcBmp.getHeight()
);
}else{
dstBmp = Bitmap.createBitmap(
srcBmp,
0,
srcBmp.getHeight()/2 - srcBmp.getWidth()/2,
srcBmp.getWidth(),
srcBmp.getWidth()
);
}
Ответ 2
В то время как большинство приведенных выше ответов предоставляют способ сделать это, уже есть встроенный способ выполнить это, и это 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 width, int высота)
Добавлен в уровень API 8 Создает центрированное растровое изображение желаемого размера.
Параметры исходная битмап исходная ширина ширина целевой ширины высота целевой высоты
Иногда я получал ошибки в памяти при использовании принятого ответа, и использование ThumbnailUtils разрешало эти проблемы для меня. Плюс, это намного чище и многократно используется.
Ответ 3
Рассматривали ли вы это с помощью layout.xml
? Вы можете установить для ImageView
ScaleType в android:scaleType="centerCrop"
и установить размеры изображения в ImageView
внутри layout.xml
.
Ответ 4
Здесь представлен более полный фрагмент, который вырезает центр [битмап] произвольных размеров и масштабирует результат до желаемого [IMAGE_SIZE]. Таким образом, вы всегда будете получать масштабируемый квадрат [croppedBitmap] центра изображения с фиксированным размером. идеально подходит для эскизов и т.д.
Его более полное сочетание других решений.
final int IMAGE_SIZE = 255;
boolean landscape = bitmap.getWidth() > bitmap.getHeight();
float scale_factor;
if (landscape) scale_factor = (float)IMAGE_SIZE / bitmap.getHeight();
else scale_factor = (float)IMAGE_SIZE / bitmap.getWidth();
Matrix matrix = new Matrix();
matrix.postScale(scale_factor, scale_factor);
Bitmap croppedBitmap;
if (landscape){
int start = (tempBitmap.getWidth() - tempBitmap.getHeight()) / 2;
croppedBitmap = Bitmap.createBitmap(tempBitmap, start, 0, tempBitmap.getHeight(), tempBitmap.getHeight(), matrix, true);
} else {
int start = (tempBitmap.getHeight() - tempBitmap.getWidth()) / 2;
croppedBitmap = Bitmap.createBitmap(tempBitmap, 0, start, tempBitmap.getWidth(), tempBitmap.getWidth(), matrix, true);
}
Ответ 5
Вы можете использовать следующий код, который может решить вашу проблему.
Matrix matrix = new Matrix();
matrix.postScale(0.5f, 0.5f);
Bitmap croppedBitmap = Bitmap.createBitmap(bitmapOriginal, 100, 100,100, 100, matrix, true);
Выше метод делает postScalling изображения перед обрезкой, поэтому вы можете получить лучший результат с обрезанным изображением без получения ошибки OOM.
Подробнее см. этот блог
Ответ 6
Наверное, это самое простое решение:
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;
Ответ 7
Чтобы исправить решение @willsteel:
if (landscape){
int start = (tempBitmap.getWidth() - tempBitmap.getHeight()) / 2;
croppedBitmap = Bitmap.createBitmap(tempBitmap, start, 0, tempBitmap.getHeight(), tempBitmap.getHeight(), matrix, true);
} else {
int start = (tempBitmap.getHeight() - tempBitmap.getWidth()) / 2;
croppedBitmap = Bitmap.createBitmap(tempBitmap, 0, start, tempBitmap.getWidth(), tempBitmap.getWidth(), matrix, true);
}
Ответ 8
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;
}
Ответ 9
public Bitmap getResizedBitmap(Bitmap bm) {
int width = bm.getWidth();
int height = bm.getHeight();
int narrowSize = Math.min(width, height);
int differ = (int)Math.abs((bm.getHeight() - bm.getWidth())/2.0f);
width = (width == narrowSize) ? 0 : differ;
height = (width == 0) ? differ : 0;
Bitmap resizedBitmap = Bitmap.createBitmap(bm, width, height, narrowSize, narrowSize);
bm.recycle();
return resizedBitmap;
}