ICode9

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

BitmapFactory.Options 解决加载大图片OOM

2019-09-16 14:57:47  阅读:242  来源: 互联网

标签:OOM Bitmap BitmapFactory options 内存 Options 图片


当在android应用中加载一张高分辨率的图片时,十分容易出现Out of memory(OOM),这是由于内存溢出造成的,每个应用所使用的堆内存大小一般是固定的.

android在加载图片的时候是使用位图来放到内存中的,那位图在内存中的占用空间计算就是 分辨率*每个像素占用的内存.

 

1、降低图片加载到内存时的图片大小: 

通过设置一个Options的属性inJustDecodeBounds=true,然后使用BitmapFactory.decodeXXX方法,让options作为参数,这样,我们在不分配内存的情况下,可以通过options读取图片的大小,outWidth和outHeight。其次通过原始图片的大小和你需要图片的大小来计算出需要缩放的比例。最后通过缩放比例值作为options.inSampleSize的值,再次调用BitmapFactory.decodeXXX,在调用方法前一定要设置inJustDecodeBounds=faluse。

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

BitmapFactory.decodeResource(context.getResources(),resId,options);
int imageWidth = options.outWidth;

int sample = imageWidth / musicPicSize;
int dstSample = 1;
if (sample > dstSample) {
dstSample = sample;
}
options.inJustDecodeBounds = false;
//设置图片采样率
options.inSampleSize = dstSample;
//设置图片解码格式
options.inPreferredConfig = Bitmap.Config.RGB_565;

Bitmap bitmap = Bitmap.createScaledBitmap(BitmapFactory.decodeResource(context.getResources(),
resId, options), musicPicSize, musicPicSize, true);

2、采用节省内存的编码方式。在Options中,有一个inPreferredConfig属性,这个属性的值是一个Bitmap.Config,我们只需要给inPreferredConfig设置一个节省内存的编码就可以了,例如:options.inPreferredConfig=Bitmap.Config.ARGB_4444.这样就ok了。

 ALPHA_8:每个像素占用1byte内存

ARGB_4444:每个像素占用2byte内存

ARGB_8888: 每个像素占用4byte内存

RGB_565:每个像素占用2byte内存

标签:OOM,Bitmap,BitmapFactory,options,内存,Options,图片
来源: https://www.cnblogs.com/diyigechengxu/p/11527217.html

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

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

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

ICode9版权所有