3

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

我分析并发现缩放将有助于解决这种与内存相关的问题。问题是我的图像尺寸为 1280 x 720,设备尺寸也相同。因此,我觉得缩放不会有任何影响。

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

场景一:

使用 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;
    }

场景二:

使用 Assets 文件夹中的位图

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

3 回答 3

3

当您的应用程序超出堆中分配的内存时,就会发生 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() 等),用于从各种来源创建 Bitmap。根据您的图像数据源选择最合适的解码方法。这些方法尝试为构造的位图分配内存,因此很容易导致 OutOfMemory 异常。每种类型的解码方法都有额外的签名,允许您通过 BitmapFactory.Options 类指定解码选项。

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

另请检查此链接以进行内存管理。

https://www.youtube.com/watch?v=_CruQY55HOk

于 2013-05-27T04:01:47.700 回答
2

有一个快速的解决方案

<application
     android:largeHeap="true" >

放入清单文件中的应用程序标签。

于 2015-07-22T06:48:16.460 回答
0

You can use the following code to load the bitmap from file:

private Bitmap decodeFile(File f,int req_Height,int req_Width){
    try {
        //decode image size
        BitmapFactory.Options o1 = new BitmapFactory.Options();
        o1.inJustDecodeBounds = true;
        BitmapFactory.decodeStream(new FileInputStream(f),null,o1);


        //Find the correct scale value. It should be the power of 2.
        int width_tmp = o1.outWidth;
        int height_tmp = o1.outHeight;
        int scale = 1;

        if(width_tmp > req_Width || height_tmp > req_Height)
        {
             int heightRatio = Math.round((float) height_tmp / (float) req_Height);
             int widthRatio = Math.round((float) width_tmp / (float) req_Width);


             scale = heightRatio < widthRatio ? heightRatio : widthRatio;
        }

        BitmapFactory.Options o2 = new BitmapFactory.Options();
        o2.inSampleSize = scale;
        o2.inScaled = false;
        return BitmapFactory.decodeFile(f.getAbsolutePath(),o2);
    } 
    catch(Exception e) 
    {
      e.printStackTrace();
    }
    return null;
}

It should resolve your out of memory exception. Link here has a good detailed explanation of your answer.

于 2013-05-27T03:48:37.857 回答