Эффективный способ использования изображений в Android (`Drawable` из` bitmap`) - PullRequest
2 голосов
/ 10 марта 2011

Изображение всегда создает для меня проблему всегда: (.
java.lang.OutOfMemoryError: bitmap size exceeds VM budget - android - это главная проблема, даже если я использую очень маленькое изображение.
Пожалуйста, предложите мне несколько советов по использованию изображения. (ссылка, учебные пособия, примеры проектов и т. д ...)

Некоторые из моих запросов

  1. Что я предпочитаю Drawable или bitmap
  2. BitmapFactory.decodeFile или Drawable.createFromPath
  3. BitmapFactory.decodeStream или Drawable.createFromStream
  4. Как сохранить Drawable и Bitmap при вращении.
  5. Это хорошая идея, чтобы сохранить или передать Drawable или Bitmap через намерение

Ответы [ 2 ]

2 голосов
/ 10 марта 2011

все зависит от того, что именно вы хотите сделать со своим изображением.bitmapfactory для создания растровых изображений.и рисуемые объекты используются, когда вы хотите что-то нарисовать:)

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

Что касается вращения, вы должны взятьзаботиться о onRestoreInstanceState и onSaveInstanceState.что-то вроде этого:

private static final String PHOTO_TAKEN = "photo_taken";
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
    if (savedInstanceState.getBoolean(PHOTO_TAKEN)) {
        // do something if you have your pic here
    }
}

@Override
protected void onSaveInstanceState(Bundle outState) {
    outState.putBoolean(PHOTO_TAKEN, mPhotoTaken); // saving the state of the image (if the photo is taken or not in this case)
}

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

ОБНОВЛЕНИЕ:
В одном из проектов я пытался показать изображение, снятое с камеры, в элементе управления ImageView для моей деятельности и получил это исключение из памяти.причина была в том, что он помещал весь большой образ в память.Обходной путь был довольно простым: я уменьшил размер изображения:

    BitmapFactory.Options options = new BitmapFactory.Options();
    options.inSampleSize = 4;

    Bitmap bitmap = BitmapFactory.decodeFile(mImagePath, options);
0 голосов
/ 06 ноября 2012

Чтобы избежать ошибки нехватки памяти, мы можем использовать BitmapRegionDecoder (для декодирования исходного изображения, размер которого превышает максимальный предел текстуры 2048x2048), или мы можем декодировать его, указав координаты из исходного растрового изображения.(например, координаты каждой четверти)

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