Центр культур андроид растровых
у меня есть растровые изображения, которые являются квадратами или прямоугольниками. Я беру самую короткую сторону и делаю что-то вроде этого:
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 lastBitmap = null;
lastBitmap = Bitmap.createScaledBitmap(finalBitmap, 144, 144, true);
проблема в том, что он обрезает верхний левый угол исходного растрового изображения, у кого-нибудь есть код для обрезки центра растрового изображения?
9 ответов:
Это может быть достигнуто с: точечный рисунок.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() ); }
хотя большинство из приведенных выше ответов предоставляют способ сделать это, уже есть встроенный способ сделать это, и это 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 (Bitmap source, int width, int высота)
добавлено в API level 8 Создает центрированное растровое изображение нужного размера.
параметры исходное растровое изображение исходная ширина целевая ширина высота целевая высота
Я иногда выходил из ошибок памяти при использовании принятого ответа, и использование ThumbnailUtils решало эти проблемы для меня. Кроме того, это гораздо чище и более многоразовые.
вы рассматривали возможность сделать это из
layout.xml
? Вы можете установить для вашегоImageView
the ScaleType доandroid:scaleType="centerCrop"
и установите размеры изображения вImageView
внутриlayout.xml
.
вы можете использовать следующий код, который может решить вашу проблему.
Matrix matrix = new Matrix(); matrix.postScale(0.5f, 0.5f); Bitmap croppedBitmap = Bitmap.createBitmap(bitmapOriginal, 100, 100,100, 100, matrix, true);
выше метод сделать postScalling изображения перед обрезкой, так что вы можете получить лучший результат с обрезанным изображением без получения ошибки OOM.
для более подробной информации вы можете обратиться этот блог
здесь более полный фрагмент, который обрезает центр [растровое] произвольных размеров и масштабирует результат до желаемого [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); }
вероятно, самое простое решение до сих пор:
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;
чтобы исправить @ 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); }
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; }
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; }