2017-01-15 10 views
1

Я пытаюсь сжать фотографию, которую я взял с камерой, не уменьшая размер изображения.Bitmap.compress - не работает

Я пробовал bitmap.compress, но это не сработало. , чтобы убедиться, что я попытался сжать на растровое изображение, загруженное из ресурса, но все равно не получилось.

любые идеи?

пример кода:

//load bitmap from resources: 
bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.trolltunga); 
Log.d("roee", "onImageCaptured: before compress = " + bitmap.getByteCount() + ", " + bitmap.getWidth() + ", " + bitmap.getHeight()); 

//compressing 
ByteArrayOutputStream bos = new ByteArrayOutputStream(); 
bitmap.compress(Bitmap.CompressFormat.JPEG, 50, bos); 
Bitmap comp = BitmapFactory.decodeStream(new ByteArrayInputStream(bos.toByteArray())); 
Log.d("roee", "onImageCaptured: after compress = " + comp.getByteCount() + ", " + comp.getWidth() + ", " + comp.getHeight()); 

результаты журнала:

D/roee: onImageCaptured: before compress = 10800000, 3000, 900 
D/roee: onImageCaptured: after compress = 10800000, 3000, 900 
+1

«Растровое изображение» никогда не сжимается. Ваш код работает точно так, как ожидалось. Растровый * файл * будет сжат, когда вы будете «сжимать»() с использованием сжатого формата файла, такого как «PNG» или «JPEG» (и, технически, ваш «ByteArrayOutputStream» сжимается, а не то, что он вам очень нравится). – CommonsWare

ответ

3

Короткая версия: Вы сжать Bitmap и распаковать его сразу же после этого

Длинная версия:

A Bitmap не сжимается. Это класс контейнера для массива байтов, который представляет изображение в полном размере, для более быстрого рисования и обработки.

Он часто используется для загрузки изображения в другом формате, скажем, JPEG в память для отображения или редактирования и имеет несколько методов для прямой загрузки или сохранения в другие форматы файлов.

Один из них - compress, который превращает несжатый массив байтов в сжатый формат файла (в вашем случае JPEG), а затем выводит его в поток, чтобы вы могли сохранить его на хранение или что-то в этом роде.

Когда вы используете BitmapFactory.decodeStream, он считывает информацию в потоке, распознает формат файла и декодирует его несжатому массиву байтов. Обычно вы просто используете это для загрузки хранилища формы изображения.

Что вы здесь сделали, возьмите Bitmap, сжимаете его в JPEG (теряете некоторую информацию), а затем снова декодируете этот JPEG в несжатый битмап, который имеет такое же разрешение, таким образом, такое же количество байт и одинаковый размер в памяти ,

Решение: Если вы хотите увидеть, если компресс работал, просто измерить размер выходного потока с bos.toByteArray().length

0

Вы не можете сжать битовую карту. Только ByteArrayOutputStream сжимается до определенного формата, например JPEG, вы можете проверить сжатую длину ByteArrayOutputStream.