Android加载大图避免OOM

先看错误吧:

 Out of memory on a 122880016-byte allocation.
04-06 22:53:13.992 16692-16692/com.cxx.loadbigimg E/AndroidRuntime: FATAL EXCEPTION: main
                                                                    Process: com.cxx.loadbigimg, PID: 16692
                                                                    java.lang.OutOfMemoryError

在这要做一个普及就是图片的大小并不是我们看到的图片具体有多大如2.2M,它的计算公式是:图片的总像素*每个像素的大小。在Android上采用ARGB的方式表示颜色每个像素占4byte。
在这个项目中我们可以看到应用程序申请了122880016byte大小的空间等于117M的大小所以导致内存溢出,那我们的做法就是采用压缩来解决主要可以分为如下几个步骤:

  1. 获取手机分辨率
  2. 创建图片工厂的配置参数
  3. 设置属性不去真正解析Bitmap返回一个null,能得到图片的宽和高
  4. 通过设置的属性加载Bitmap
  5. 得到图片的宽和高
  6. 计算缩放比
  7. 按照缩放比显示
  8. 真正解析图片
  //1.获取手机分辨率
        WindowManager windowManager = (WindowManager) getSystemService(WINDOW_SERVICE);
        int width = windowManager.getDefaultDisplay().getWidth();
        int height = windowManager.getDefaultDisplay().getHeight();

        //2.创建图片工厂的配置参数
        BitmapFactory.Options options = new BitmapFactory.Options();
        //3.设置属性不去真正解析Bitmap返回一个null,能得到图片的宽和高
//        options.inJustDecodeBounds = true;
        //4.通过设置的属性加载Bitmap
        BitmapFactory.decodeResource(getResources(), R.drawable.dog, options);

        //5.得到图片的宽和高
        int outWidth = options.outWidth;
        int outHeight = options.outHeight;
        //6.计算缩放比
        int mscare = 1;
        int scareX = outWidth / width;
        int scareY = outHeight / height;
        int min = Math.min(scareX, scareY);
        if (min > 1) {
            mscare = min;
        }
        //7.按照缩放比显示
        options.inSampleSize = mscare;
        //8.真正解析图片
        options.inJustDecodeBounds = false;
        Bitmap scareBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.dog, options);
        img.setImageBitmap(scareBitmap);

总共分为这八步就可以实现图片的压缩了。
源码地址:
源码地址

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值