2011-12-16 2 views
3

У меня мало вопросов по обработке больших растровых изображений, я не смог найти ответ по тем, которые я нашел, где эта проблема обсуждалась до сих пор.Приложение для Android-камеры - Большая обработка растровых изображений

У меня есть Nexus S, который, когда я беру изображение с классом hardware.Camera, как это:

Camera.PictureCallback mPictureCallback = new Camera.PictureCallback() { 
    public void onPictureTaken(byte[] imageData, Camera c) { 
     if (imageData != null) { 
      BitmapFactory.decodeByteArray(imageData, 0, imageData.length, options); 
     } 
    } 
}; 

Имея в виду, что изображение является 5MPixels, применение в точке decodeByteArray падает. Итак, я подумал, что если это произойдет, то как это сделать в приложении для камеры Android.

Я скачал источник и там я нашел способ makeBitmap там: http://www.java2s.com/Open-Source/Android/android-platform-apps/Gallery/com/android/camera/Util.java.htm

Так что я изменил мой обратный вызов использовать makeBitmap:

Camera.PictureCallback mPictureCallback = new Camera.PictureCallback() { 
    public void onPictureTaken(byte[] imageData, Camera c) { 
     if (imageData != null) { 
      Bitmap bitmap = Utils.makeBitmap(imageData, 50 * 1024); 
     } 
    } 
}; 

Так что я взял этот метод и используется в моем приложении. Не только то, что изображение, которое я создаю с помощью этого метода, находится в низком качестве, но также, если я сделаю число пикселей (50 * 1024) больше, у меня будет другая проблема OutOfMemory.

Так что мой вопрос был бы, если бы я хотел использовать большие растровые изображения, а большим я имею в виду PNG с альфа-слоями размером около 500x300, как я могу это сделать? Как делается на самом деле создание большого изображения в приложении для Android-камеры?

Спасибо!

+1

Что было причиной аварии? Предоставьте starttrace/logcat. И исходная ссылка кажется неправильной. Нет метода makeBItmap() с этой сигнатурой –

ответ

0

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

Но вы можете сохранить из растрового изображения:

byte[] imageData; 
FileOutputStream out = new FileOutputStream(file); 
out.write(imageData, 0, imageData.length); 
out.flush(); 
out.close(); 

а позже нагрузки в субдискретизированную версии для отображения.

FileInputStream inputStream = new FileInputStream(file); 
BitmapFactory.decodeStream(inputStream, null, options); 

Таким образом, вы сохраняете изображение с оригинальным размером, сохраняя при этом изображение без переполнения.

Примечание. Вам нужно будет использовать параметры, чтобы указать сумму, по которой вы уменьшаете размер. Вы можете поместить это в блок try {} catch {} и цикл, который увеличивает приращение вниз, если вы не уверены, сколько вам потребуется.

0

Есть несколько вещей, которые вы можете попробовать, чтобы освободить память, но это будет в конечном счете сводятся к размеру растрового изображения, к сожалению

одна вещь, которую вы можете сделать, это установить imageData обнулить после декодирования

Смежные вопросы