У меня есть битовый массив... и если бы высота битового массива больше, чем maxHeight, или ширина больше, чем maxWidth, я хотел бы пропорционально изменить размер изображения так, чтобы это поместилось в maxWidth X maxHeight. Вот то, что я пробую:
BitmapDrawable bmp = new BitmapDrawable(getResources(), PHOTO_PATH);
int width = bmp.getIntrinsicWidth();
int height = bmp.getIntrinsicHeight();
float ratio = (float)width/(float)height;
float scaleWidth = width;
float scaleHeight = height;
if((float)mMaxWidth/(float)mMaxHeight > ratio) {
scaleWidth = (float)mMaxHeight * ratio;
}
else {
scaleHeight = (float)mMaxWidth / ratio;
}
Matrix matrix = new Matrix();
matrix.postScale(scaleWidth, scaleHeight);
Bitmap out = Bitmap.createBitmap(bmp.getBitmap(),
0, 0, width, height, matrix, true);
try {
out.compress(Bitmap.CompressFormat.JPEG, 100,
new FileOutputStream(PHOTO_PATH));
}
catch(FileNotFoundException fnfe) {
fnfe.printStackTrace();
}
Я получаю следующее исключение:
java.lang.IllegalArgumentException: bitmap size exceeds 32bits
Что я делаю неправильно здесь?
Ваши scaleWidth и scaleHeight должны быть масштабными коэффициентами (то есть не очень большими числами), но ваш код, кажется, передает фактическую ширину и высоту, которые вы ищете. Таким образом, вы в конечном итоге значительно увеличиваете размер растрового изображения.
Я думаю, что есть и другие проблемы с кодом для получения scaleWidth и scaleHeight. Во-первых, ваш код всегда имеет либо scaleWidth = width , либо scaleHeight = height , и изменяет только один из них, поэтому вы будете искажать соотношение сторон изображения как хорошо. Если вы просто хотите изменить размер изображения, у вас должен быть только один scaleFactor .
Кроме того, почему ваш оператор if фактически проверяет maxRatio> ratio ? Разве вы не должны проверять width> maxWidth или height> maxHeight ?