Я обрезаю изображение, возвращенное приложением (по умолчанию) для камеры, но результатом является файл большего размера (~ 4 раза больше).Неожиданное поведение при обрезке изображений
Bitmap bitmapOrg = BitmapFactory.decodeFile(OrigImagePath);
int width = bitmapOrg.getWidth();
int height = bitmapOrg.getHeight();
int shortLength = (width <= height) ? width : height;
// square proportions
int xOffset = (width - shortLength)/2;
int yOffset = (height - shortLength)/2;
Bitmap resizedBitmap = Bitmap.createBitmap(bitmapOrg, xOffset, yOffset, shortLength, shortLength);
// save
File f = new File(Util.getDir(OrigImagePath) + File.separator + "thumbnail.jpg");
try {
FileOutputStream out = new FileOutputStream(f);
resizedBitmap.compress(Bitmap.CompressFormat.JPEG, 100, out);
out.flush();
out.close();
} catch (Exception e) {
e.printStackTrace();
}
Я только что узнал о несоответствии размера файла. Неудивительно, что я получал OutOfMemoryErrors
. Я знаю, что могу использовать BitmapFactory.Options inSampleSize
, но я просто хочу обрезать исходное изображение без потери деталей. Здесь явно что-то не хватает.
'resizedBitmap.compress (Bitmap.CompressFormat.JPEG, 100, out);' создает несжатую jpeg-версию вашего растрового изображения. – njzk2
Означает ли это, что исходный битмап уже сжат? Я хочу, чтобы результат был таким же, как и оригинал (просто обрезание сторон). – user1923613
Растровое изображение по определению не сжато. 'OrigImagePath', однако, является сжатым файлом изображения. Когда вы декодируете его в растровое изображение, результирующее растровое изображение не сжимается. Когда вы сжимаете его до 'f', формат, который вы выбираете, является без потерь, поэтому очень большой. – njzk2