大图片加载到内存的OOM异常

OOM 为 out of memory 的缩写 也就是常见的内存溢出

一般在大图片加载时经常会出现内存溢出的情况 比如一张3000*2029像素的图片 

如果按照ARGB8888的格式 每一个pixel 占 4个byte  其中每一个字节用于存储A(透明)R(红色)G(绿色)B(蓝色)对应的0-255的取值

而一张3000*2029的图片如果要加载到内存就需要用 3000*2029*4 = 24348000byte = 23M的运行内存

而这样不做任何处理的加载操作很有可能会导致OOM


下面贴出一段会报OOM异常的代码并附上导致OOM的高清图

Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.xxx,opts);
imageView.setImageBitmap(bitmap);



接下来提供解决方案  android 系统本身针对这种情况已经给出了解决方案 ---这里介绍的是其中一种  实际中应当结合多种方案防止OOM问题

BitmapFactory.Options 是android 提供的类  这个的意义就是 图片的参数类  在解析图片时将该参数传入 图片就会按照参数进行解析 

BitmapFactory.Options 又一个属性是opts.inSampleSize 是设置图片的缩放比例 我们可以通过代码对其赋值 比如赋值为4  官方文档上说明是 会将改图片的宽高各缩小4倍

然后返回一个只有未作处理前图片大小的1/16的大小的图片 但是实际情况并不一定会按照这个比例 缩放  比如 

S4   inSampleSize = 4  3000*2029 ---> 1000*677pixel 2708000 byte =2.58m

NOTE3  inSampleSize = 4  3000*2029 ---> 1500*1016 pixel 6096000 byte = 5.8m

但是肯定是会对图片进行缩放 从而达到缩小图片的目的  至于为何不是按照比例所放的愿意暂时还不清楚如果有明白的大牛麻烦讲解下

下面贴出解决代码:

        //图片参数选项
        BitmapFactory.Options opts = new BitmapFactory.Options();
        //设置不真正去解析位图 只是获取位图信息
        opts.inJustDecodeBounds = true;
        BitmapFactory.decodeResource(getResources(), R.drawable.xxx, opts);
        int windowH = getResources().getDisplayMetrics().heightPixels;
        int windowW = getResources().getDisplayMetrics().widthPixels;
        //根据窗口宽高 和 图片宽高 计算出缩放比例
        int scaleX = opts.outHeight / windowH;
        int scaleY = opts.outWidth / windowW;

        int scale = 1;

        //获取差值最大的一个 进行缩放

        if(scaleX > scaleY && scaleX>1) {
            scale = scaleX;
        }
        if(scaleY > scaleX && scaleY>=1) {
            scale = scaleY;
        }

        //设置为false才能真正去解析位图
        opts.inJustDecodeBounds = false;
        //设置图片的缩放比例 如果为4则将图片缩16倍 实际并非如此
        opts.inSampleSize = 4;
        //根据opts的缩放大小对图像进行缩放 这样就不会造成OOM了
        Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.xxx,opts);
        imageView.setImageBitmap(bitmap);


这是解决OOM的一种最基本的方法 其他的方法如软引用  结合使用最佳

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值