Bitmap的高效加载

1、Android内存分配

Android给每个APK分配相应的内存空间,一般情况下只要APK超过个空间的限制,就会报OOM

    Runtime rt = Runtime.getRuntime();
    long maxMemory = rt.maxMemory();
    Log.i("maxMemory:", Long.toString(maxMemory / (1024 * 1024)));

这里写图片描述

在不考虑largeHeap和native的情况下,当前手机分配的内存空间不能超过384M,这个值的大小和手机的配置也有很大关系,在早期的手机中分配空间可能是几十M,包括现在配置比较低的手机也是分配100多M的内存空间,因此开发者必须合理的分配内存空间,避免OOM

2、Bitmap是造成OOM的主要原因之一

对于APP来说,一般加载的都是json数据,主要包括文本和图片,对于文本几乎是没有优化的空间的,而图片对内存的消耗是非常大的,特别是没有经过处理的高清大图。因此开发者需要特别重视对Bitmap图片的处理。

3、高效加载Bitmap

1、采样率压缩

原理:降低图片像素,减小内存占用
1)设置采样率为true
2)取出原始图片宽高
3)设置采样率
4)设置采样率为flase,重新加载图片
示例:

  public static Bitmap compressImageToBitmap(String imagePath){  
        BitmapFactory.Options options = new BitmapFactory.Options();  
        options.inJustDecodeBounds = true;  
        Bitmap bitmap = BitmapFactory.decodeFile(imagePath,options);  
        options.inJustDecodeBounds = false;  
        options.inSampleSize = 2;  

        bitmap = BitmapFactory.decodeFile(imagePath,options); 
        return bitmap;  
    }  

2、质量压缩

原理:改变图片人深度和透明度,减少图片区域某些点相近的像素
示例:

 public static void qualityCompress(Bitmap bmp, File file) {
        // 0-100 100为不压缩
        int quality = 20;
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        // 把压缩后的数据存放到baos中
        bmp.compress(Bitmap.CompressFormat.JPEG, quality, baos);
        try {
            FileOutputStream fos = new FileOutputStream(file);
            fos.write(baos.toByteArray());
            fos.flush();
            fos.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

3、尺寸压缩

原理:减少图片的宽高来降低像素

 public static void sizeCompress(Bitmap bmp, File file) {
        // 尺寸压缩倍数,值越大,图片尺寸越小
        int ratio = 8;
        // 压缩Bitmap到对应尺寸
        Bitmap result = Bitmap.createBitmap(bmp.getWidth() / ratio, bmp.getHeight() / ratio, Config.ARGB_8888);
        Canvas canvas = new Canvas(result);
        Rect rect = new Rect(0, 0, bmp.getWidth() / ratio, bmp.getHeight() / ratio);
        canvas.drawBitmap(bmp, null, rect, null);

        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        // 把压缩后的数据存放到baos中
        result.compress(Bitmap.CompressFormat.JPEG, 100, baos);
        try {
            FileOutputStream fos = new FileOutputStream(file);
            fos.write(baos.toByteArray());
            fos.flush();
            fos.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值