Android успешно сфотографировал

1

Это может звучать как странный/глупый вопрос. Но выслушай меня.

Приложения для Android, по крайней мере, на T-Mobile G1, ограничены 16 мегабайтами кучи.

И для хранения изображения требуется 4 байта на пиксель (в форме растрового изображения):

public void onPictureTaken(byte[] _data, Camera _camera) {
    Bitmap temp = BitmapFactory.decodeByteArray(_data, 0, _data.length);
}           

Таким образом, 1 изображение с разрешением 6 мегапикселей занимает 24 МБ кучи. (Переполнение памяти Cue).

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

Но как насчет сценария, когда я хочу использовать камеру как качественную камеру!

Я не знаю, как получить этот образ в базе данных. Как только я декодирую, это ошибки.

Примечание. Мне нужно (?) Преобразовать его в Bitmap, чтобы я мог повернуть его перед сохранением.

Итак, подведем итог:

  • Ограничено до 16 МБ кучи
  • Изображение занимает 24 МБ кучи
  • Недостаточно места для захвата изображения и управления ими

Это не касается проблемы, но я рекомендую ее как отправную точку для других, которые просто загружают изображения из местоположения: Отображение растровых изображений на Android

Теги:
camera
memory
heap

2 ответа

3
Лучший ответ

Я могу только подумать о нескольких вещах, которые могут помочь, ни один из них не является оптимальным

  1. Выполняйте серверные операции вращения

  2. Храните данные из захвата непосредственно в SDCARD без его декодирования, затем вращайте его куском с помощью файловой системы, а затем отправляйте ее в свою БД. Множество примеров в Интернете (если ваши углы просты, 90 180 и т.д.), Хотя это потребует много времени, поскольку операции ввода-вывода с SDCARD выполняются не очень быстро.

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

    Опции opt = new Options();

    opt.inPreferredConfig = Bitmap.Config.RGB_565;

    //Декодируем необработанную камеру растровым изображением без альфа-канала
    bmp = BitmapFactory.decodeByteArray(raw, 0, raw.length, opt);


Там может быть лучший способ сделать это, но так как ваше устройство настолько ограничено в куче и т.д. Я не могу думать ни о чем.

Было бы неплохо, если бы был факультативный матричный метод на основе файлов (который в целом является тем, что я предлагаю как вариант 2), или какой-то "пейджинговой" системой для Android, но это лучшее, что я могу придумать.

  • 0
    Это действительно самый умный способ достичь своей цели. В идеале вы хотите выполнить любую тяжелую работу на стороне сервера, потому что ваш телефон не обладает большой вычислительной мощностью, особенно G1.
  • 0
    Я на самом деле тестирую на HTC One X, но он не в состоянии выполнить операцию из-за ограничения размера кучи приложения. Плюс это должно работать на OS 10 в любом случае. Спасибо за предложения, попробую номер 2 завтра. Глядя на 3, он собирается сбросить только 1 из 4 каналов. Моя камера 8 мегапикселей, поэтому все еще 24 МБ, плюс чем меньше памяти используется, тем лучше.
Показать ещё 1 комментарий
0

Сначала сохраните его в файловой системе, выполните свои операции с файлом из файловой системы...

  • 0
    Он хранится в виде массива (повернутого) в базе данных.
  • 0
    @ Doomsknight - Почему бы просто не сохранить пути к изображениям в БД, а затем сохранить фактические изображения в файловой системе?
Показать ещё 3 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню