OutOfMemory exception when loading bitmap from external storage

前端 未结 13 1702
广开言路
广开言路 2020-11-29 06:52

In my application I load a couple of images from JPEG and PNG files. When I place all those files into assets directory and load it in this way, everything is ok:

         


        
相关标签:
13条回答
  • 2020-11-29 07:37

    Thanks to all the threads, I've found a solution that works for me on a real device. The tricks are all about using

    BitmapFactory.Options opts=new BitmapFactory.Options();
    opts.inSampleSize=(int)(target_size/bitmap_size); //if original bitmap is bigger
    

    But for me this was not enough. My original image (taken from the Camera app) was 3264x2448. The correct ratio for me was 3, since i wanted a plain VGA image of 1024x768.

    But setting inSampleSize to 3 was not enough: still out of memory exception. So in the end I opted for a iterative approach: I start from the computed correct size, and increase it until I stop having a OOM exception. For me it was at sample of 4.

    // Decode with inSampleSize
    BitmapFactory.Options o2 = new BitmapFactory.Options();
    // o2.inSampleSize = scale;
    float trueScale = o.outWidth / 1024;
    o2.inPurgeable = true;
    o2.inDither = false;
    Bitmap b = null;
    do {
         o2.inSampleSize = (int) trueScale;
         Log.d(TAG, "Scale is " + trueScale);
     try {
        b = BitmapFactory.decodeStream(new FileInputStream(f), null, o2);
        } catch (OutOfMemoryError e) {
            Log.e(TAG,"Error decoding image at sampling "+trueScale+", resampling.."+e);
            System.gc();
        try {
            Thread.sleep(50);
         } catch (InterruptedException e1) { 
             e1.printStackTrace();
         }
    }
        trueScale += 1;
    } while (b==null && trueScale < 10);
    return b;
    
    0 讨论(0)
提交回复
热议问题