Percy

位图的内存不足错误

java

在运行时,我试图将图像放置在表面视图中。当我尝试使用Drawable文件夹中的图像时,出现内存不足错误。在中快速搜索之后,我发现,如果我们从资产文件夹访问图像,将会有所缓解。但仍然在运行时出现内存不足错误。

我已经分析发现,扩展将有助于解决此类与内存相​​关的问题。问题是我的图像尺寸为1280 x 720,设备尺寸也相同。因此,我觉得缩放不会有任何效果。

由于我们在该社区中拥有专家,如果您能通过一些建议/示例来帮助我解决此类问题,我们将不胜感激。

方案1:
使用Drawable文件夹中的位图。

backgoundImage = Bitmap.createScaledBitmap(BitmapFactory.decodeResource(getResources(), R.drawable.backgroundhomepage), (int) dWidth, (int) dHeight, true);

    /***********************************************************************************************************************************************************
    1.  To get the image from asset library
     **************************************************************************************************************************************************************/ 

    public  Bitmap getAssetImage(Context context, String filename) throws IOException {
        AssetManager assets = context.getResources().getAssets();
        InputStream buffer = new BufferedInputStream((assets.open("drawable/" + filename + ".png")));
        Bitmap bitmap = BitmapFactory.decodeStream(buffer);
        return bitmap;
    }

方案2:
使用资产文件夹中的位图

backgoundImage = Bitmap.createScaledBitmap(getAssetImage(context,"backgroundhomepage"), (int) dWidth, (int) dHeight, true);

阅读 393

收藏
2020-12-07

共2个答案

一尘不染

当您的应用超出堆中分配的内存时,就会发生OutofMemory。位图太大,无法放入内存,即堆。在这种情况下,内存不足。您需要缩小位图,然后再使用该位图。为此,请检查下面的链接

http://developer.android.com/training/displaying-bitmaps/load-bitmap.html。

还有一个博客@ http://android-developers.blogspot.in/2009/01/avoiding-memory-leaks.html(避免内存泄漏)

 public static Bitmap decodeFile(File f,int WIDTH,int HIGHT){
 try {
     //Decode image size
     BitmapFactory.Options o = new BitmapFactory.Options();
     o.inJustDecodeBounds = true;
     BitmapFactory.decodeStream(new FileInputStream(f),null,o);

     //The new size we want to scale to
     final int REQUIRED_WIDTH=WIDTH;
     final int REQUIRED_HIGHT=HIGHT;
     //Find the correct scale value. It should be the power of 2.
     int scale=1;
     while(o.outWidth/scale/2>=REQUIRED_WIDTH && o.outHeight/scale/2>=REQUIRED_HIGHT)
         scale*=2;

     //Decode with inSampleSize
     BitmapFactory.Options o2 = new BitmapFactory.Options();
     o2.inSampleSize=scale;
     return BitmapFactory.decodeStream(new FileInputStream(f), null, o2);
 } catch (FileNotFoundException e) {}
 return null;
}

引用文档

BitmapFactory类提供了几种解码方法(decodeByteArray(),decodeFile(),decodeResource()等),用于从各种来源创建位图。根据您的图像数据源选择最合适的解码方法。这些方法尝试为构造的位图分配内存,因此很容易导致OutOfMemory异常。每种类型的解码方法都有其他签名,可让您通过BitmapFactory.Options类指定解码选项。

解码时将inJustDecodeBounds属性设置为true可以避免内存分配,为位图对象返回null,但设置outWidth,outHeight和outMimeType。此技术使您可以在位图的构造(和内存分配)之前读取图像数据的尺寸和类型。

2020-12-07
一尘不染

有一个快速的解决方案

<application
     android:largeHeap="true" >

放入清单文件中的appplication标签。

2020-12-07