Обработка большого растрового изображения в Android

Я просто хочу открыть собственное приложение камеры из своего приложения, чтобы сделать снимок и установить его в качестве фонового изображения моего экрана, а затем повернуть его при нажатии кнопки. Фотография поворачивается n раз, если она сделана 3-мегапиксельной камерой. Если я устанавливаю разрешение камеры на 5MP или более, приложение принудительно закрывается при пятом нажатии кнопки (фото поворачивается 4 раза).

Bitmap rotatedBitmap = null; 
int curAngle = 0; 

private Bitmap rotateImageBitmap(Bitmap capturedPhotoBitmap) {       

if(rotatedBitmap != null  ) 
{ 
    rotatedBitmap = null; 
} 

Matrix matrix = new Matrix(); 
curAngle = (curAngle + 90) % 360; 
matrix.postRotate(curAngle); 
rotatedBitmap =  Bitmap.createBitmap(capturedPhotoBitmap, 0, 0,  capturedPhotoBitmap.getWidth(),  capturedPhotoBitmap.getHeight(), matrix, true); 

return rotatedBitmap;         
 } 

Это из Руководства разработчика....
1. Мобильные устройства обычно имеют ограниченные системные ресурсы. Устройства Android могут иметь всего 16 МБ памяти, доступной для одного приложения.

2. Растровые изображения занимают много памяти, особенно для насыщенных изображений, таких как фотографии. Например, камера Galaxy Nexus делает фотографии размером до 2592x1936 пикселей (5 мегапикселей). Если используется конфигурация растрового изображения ARGB_8888 (по умолчанию, начиная с Android 2.3), то загрузка этого изображения в память занимает около 19 МБ памяти (2592 * 1936 * 4 байта), что немедленно исчерпает лимит для каждого приложения на некоторых устройствах.

Большинство современных телефонов оснащены камерами с разрешением 8 мегапикселей и выше. поэтому изображения будут большими. Как я могу повернуть свою фотографию «n» количество раз, не беспокоясь о разрешении камеры. Мне нужно его сжать? Каков наилучший способ? Пожалуйста помогите.


person SANDHYA    schedule 25.06.2012    source источник


Ответы (1)


Вместо того, чтобы хранить изображение в куче в ОЗУ, я бы загрузил (читай: буферизировал) изображение на диск в каталоге кеша вашего приложения. http://developer.android.com/reference/android/content/Context.html#getCacheDir()

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

См. http://developer.android.com/reference/android/graphics/BitmapFactory.Options.html#inSampleSize и http://developer.android.com/reference/android/graphics/BitmapFactory.html

Выбранный размер выборки зависит от размера растрового изображения (в пикселях) и размера представления, в которое вы загружаете изображение (в пикселях).

Чтобы узнать размеры изображения, используйте параметр «inJustDecodeBounds» в объекте BitmapFactory.Options.

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

Размер выборки 2 = 1/4 размера. Размер выборки 4 = 1/16 размера и т. д.

person WindyB    schedule 25.06.2012