ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

android – Bitmap的Out of Memory错误

2019-09-15 23:25:16  阅读:245  来源: 互联网

标签:android android-image android-canvas


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

我已经分析并发现缩放将有助于解决这种与内存相关的问题.问题是我的图像尺寸为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:

使用Assets文件夹中的Bitmap

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

解决方法:

当您的应用程序超出堆中分配的内存时,会发生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.此技术允许您在构造(和内存分配)位图之前读取图像数据的尺寸和类型.

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

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

标签:android,android-image,android-canvas
来源: https://codeday.me/bug/20190915/1806247.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有