Растерното изображение няма памет

Опитвам се да получа изображение от галерията (по намерение).
Получих тази грешка:

985120-byte external allocation too large for this process.
Out of memory: Heap Size=4871KB, Allocated=2472KB, Bitmap Size=19677KB
VM won't let us allocate 985120 bytes

Това е моят код, където получавам изображение:

protected void onActivityResult(int requestCode, int resultCode, Intent data) {
   ....
   mBitmap = Media.getBitmap(this.getContentResolver(), data.getData());
   ...
}

Как мога да го реша?

-------- АКТУАЛИЗАЦИЯ ---------

Забелязах, че ако избера предварително съществуващо изображение (инсталирана HTC снимка), получавам тази грешка. Ако избера изображение, избрано от камерата, всичко работи добре.

И така, променям кода си според този http://developer.android.com/training/displaying-bitmaps/load-bitmap.html:

BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;

InputStream stream = getContentResolver().openInputStream(data.getData());
mBitmap = BitmapFactory.decodeStream(stream,null,options);
stream.close();

Но сега растерното изображение е NULL !!!


person enfix    schedule 27.08.2012    source източник
comment
Възможен дубликат на stackoverflow.com/questions/6118464/   -  person Ridcully    schedule 27.08.2012
comment
options.inJustDecodeBounds = вярно; с това вие само декодирате размера на растерното изображение, а не го разпределяте, така че това е причината да е нула. Опитайте да използвате options.inScale, за да намалите размера на растерното изображение.   -  person Marcio Covre    schedule 27.08.2012
comment
stackoverflow.com/a/4665992/1615280   -  person bjorncs    schedule 27.08.2012
comment
developer.android.com/training/displaying-bitmaps/   -  person esse    schedule 03.12.2012


Отговори (2)


Изглежда, че вашето приложение използва много растерно изображение с висока разделителна способност (дялът на паметта на растерното изображение е 19677 KB). Сигналите „купчина“ и „разпределени“ са съвсем нормални и не би трябвало да представляват проблем. Уверете се, че премахвате неизползваното растерно изображение от паметта. Можете да освободите растерно изображение от паметта, като извикате bitmap.recycle() или зададете препратката към него на нула. Разгледайте LruCache, ако искате да кеширате растерни изображения от съображения за ефективност.

person bjorncs    schedule 27.08.2012
comment
LruCache пример с малко повече подробности - person zapl; 27.08.2012
comment
Получих тази грешка, когато избера примерно изображение в моята галерия (инсталирано изображение на htc), което е 19 MB (може би). - person enfix; 27.08.2012
comment
Добре, мислех, че 985120 байта, споменати в съобщението за грешка, са размерът на вашето изображение. 19 MB са много данни, може да няма добро решение за това, ако използвате HTC телефон с ниски спецификации. Има функция за преоразмеряване на изображения в движение, докато анализирате, изчакайте.... - person bjorncs; 27.08.2012
comment
Това работи, ако добавя stream.close() преди второ използване. В противен случай получих bitmap=null - person enfix; 28.08.2012

Винаги обгръщам декодирането в цикъл while, увеличавайки inSampleSize и улавя OutOfMemoryError. Това ще ви даде изображение с максимална възможна разделителна способност. Винаги използвайте LRU кешове!

    Bitmap image;
    boolean success = false;int counter = 0;
    while (success == false && counter < 10)
    {
        try
        {
            image = BitmapFactory.decodeFile(photoPath, options);
            success = true;
        }
        catch(OutOfMemoryError e)
        {
            System.gc();
            options.inSampleSize++;
            counter++;
        }
    }
person Noah Seidman    schedule 27.08.2012