Как сжать захваченное изображение до определенного размера в Android?

Я снимаю изображения с помощью своей камеры Android, но камера имеет разрешение 8 МП, поэтому я получаю изображения в формате jpeg размером 4-5 МБ. Итак, я попытался сжать их до 1 МБ, используя следующий код.

data содержит изображение в формате jpeg, а baos имеет тип ByteArrayOutputStream.

while ( data.length > 1 * 1024  * 1024 )
{
    System.gc();
    Log.e(TAG,"Data size "+ (data.length/1024));
    bitmapData.compress(CompressFormat.JPEG, compressionRatio, baos);
    data = baos.toByteArray();
    Log.e(TAG,"Data size "+ (data.length/1024));
    compressionRatio -= 5 ;
}

Это позволяет мне сделать несколько снимков, но после пары снимков приложение вылетает с журналом ошибок Out of memory. Может ли кто-нибудь предложить лучшее решение для сжатия JPEG.

Спасибо


person rahulg    schedule 27.10.2012    source источник
comment
stackoverflow.com/ вопросы/4943016/.   -  person Raghunandan    schedule 27.10.2012
comment
stackoverflow.com/questions/6265008/   -  person Juned    schedule 27.10.2012
comment
просто используйте FileOutputStream out = new FileOutputStream(file); bm.compress(Bitmap.CompressFormat.JPEG, 90, вне);   -  person SubbaReddy PolamReddy    schedule 27.10.2012
comment
В первых двух решениях я не получу окончательный размер изображения JPEG. Итак, я не могу сжимать в зависимости от размера .jpeg . В то время как в решении @SubbaReddyPolamReddy запись на внешнее запоминающее устройство займет очень много времени и замедлит процесс.   -  person rahulg    schedule 27.10.2012
comment
вы используете устройство или затмение... оно не замедляется...   -  person SubbaReddy PolamReddy    schedule 27.10.2012
comment
Нельзя ли выбрать меньший размер изображения? Ваша 8-мегапиксельная камера определенно поддерживает разрешение 1600×1200 пикселей.   -  person Alex Cohn    schedule 29.10.2012


Ответы (2)


Проблема с предоставленным вами решением заключается в том, что растровое изображение выделяет всю память. Что вам нужно сделать, это добавить это в конец вашего цикла.

bitmapData.recycle();
System.gc();

Это помечает растровое изображение как мертвое и готовое к сборке мусора и вручную вызывает сборщик мусора.

person Huy T    schedule 20.05.2013

Старый вопрос, но я надеюсь, что это кому-то поможет. Добавление этого кода в начало цикла сбросит byteArrayOutputStream (baos):

baos.reset();
person Eren    schedule 05.12.2015