Как изменить размер изображения с нестандартного размера
Мне нужно изменить размер изображения с нестандартным размером. Изображение взято с камеры или галереи устройства, я устал от приведенного ниже кода, но изображение растянуто, мне нужно изображение в квадратной форме без какого-либо растяжения.
public Bitmap decodeSampledBitmapFromFile(Bitmap bm, int boundBoxInDp) {
boundBoxInDp=300;
int height = bm.getHeight();
int width = bm.getWidth();
float scaleWidth = ((float) boundBoxInDp) / width;
float scaleHeight = ((float) boundBoxInDp) / height;
Matrix matrix = new Matrix();
matrix.postScale(scaleWidth, scaleHeight);
Bitmap resizedBitmap = Bitmap.createBitmap(bm, 0, 0, width, height,
matrix, false);
return resizedBitmap;
}
3 ответа
Это не поместит ваше изображение в ограничивающий прямоугольник (отказ от которого, по-видимому, и называется "растянуть"). Он не будет обрабатывать прямоугольные растровые изображения в вашей квадратной ограничительной рамке, а также не будет обрабатывать изображения, которые меньше, чем ограничивающей рамки. Вы, вероятно, хотите что-то вроде:
public Bitmap decodeSampledBitmapFromFile(Bitmap bm, int boundBoxInDp) {
boundSquareInPx=convertToPixels(300);
int maxDimen = Math.max(bm.getHeight(), bm.getWidth())
float scale = (maxDimen <= boundSquareInPx) ? 1 : boundSquareInPx / (float) maxDimen;
float scaleWidth = scale * bm.getWidth();
float scaleHeight = scale * bm.getHeight();
Matrix matrix = new Matrix();
matrix.postScale(scaleWidth, scaleHeight);
Bitmap resizedBitmap = Bitmap.createBitmap(bm, 0, 0, width, height,
matrix, true);
return resizedBitmap;
}
Несколько замечаний: если ваше изображение меньше вашей границы, оно не подойдет - очевидные модификации делают это.
Во-вторых, dp!= Px; Bitmap
объект возвращает px, поэтому вам придется преобразовать его в px из dp (что хорошо описано в других местах).
использование postTranslate(...)
если вам нужно центрировать соответственно обрезанное растровое изображение.
Документация здесь; это уже лучшая библиотека, которую я знаю по изменению размера в Android - мне больше ничего не нужно, и я давно в игре и часто с этим работаю.
Если вам нужно, на мой взгляд, лучшее введение в эффективную работу с API: прочитайте исходный код ImageView и Drawable
экземпляры; действительно стоящее личное занятие по развитию было бы использовать SDK для реализации рисования переходов с замиранием, которое обрезается по центру, так как это довольно досадно, единственная вещь, отсутствующая в библиотеке Android, и включало бы в себя множество подобных вещей. кодирование вы пытаетесь сделать выше.
NB:
Как вы заметите, другой ответчик указал на существование createScaledBitmap
, что, вероятно, гораздо более понятный код; Я просто хотел указать, как то, что вы делаете, было в принципе правильно и как это можно улучшить.
Лучший.
Если у вас уже есть растровое изображение, вы можете использовать следующий код для изменения размера:
Bitmap originalBitmap = <original initialization>;
Bitmap resizedBitmap = Bitmap.createScaledBitmap(originalBitmap, newWidth, newHeight, false);
Или вы можете использовать следующую библиотеку для изменения размера изображения
Метод называется compressAndSaveImage
,