Приложение Android Camera - обработка больших растровых изображений - PullRequest
3 голосов
/ 16 декабря 2011

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

У меня есть 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 Camera?

Спасибо!

Ответы [ 2 ]

0 голосов
/ 16 декабря 2011

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

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

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 голосов
/ 16 декабря 2011

есть пара вещей, которые вы можете ПОПРОБОВАТЬ, чтобы освободить память, но, к сожалению, это в конечном итоге приведет к размеру растрового изображения

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...