Android 性能优化:Bitmap 优化

1、优化原因
  1. Bitmap 消耗内存,内存占用过多容易发生 OOM。
2、优化方案

1、使用完释放图片资源。
2、根据图片的质量压缩。
3、根据图片的尺寸压缩。
4、设置图片缓存。

  1. 使用完释放图片资源。
    1.释放图片资源 + 软引用(SoftReference)。
    private Bitmap mBitmap;
    private SoftReference<Bitmap> bitmapSoftReference;
    
    public static void recycleBitmap(Bitmap bitmap) {
        if (bitmap != null && !bitmap.isRecycled()) {
            bitmap.recycle();
            bitmap = null;
        }
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        BitmapUtil.recycleBitmap(mBitmap);
        if(bitmapSoftReference!=null){
            BitmapUtil.recycleBitmap(bitmapSoftReference.get());
        }
    }
  1. 根据图片的质量压缩。
    1、质量压缩比例 = quality / 100。
    // 对图片质量进行压缩
    public static Bitmap compressBitmap(Bitmap bitmap) {
        ByteArrayOutputStream os = new ByteArrayOutputStream();
        // 质量压缩方法,这里100表示不压缩,把压缩后的数据存放到 os 中
        bitmap.compress(Bitmap.CompressFormat.JPEG, 100, os);
        int quality = 100;
        // 循环判断如果压缩后图片是否大于0.5M,大于继续压缩
        while (os.toByteArray().length > 1024 * 512) {
            // 清空os
            os.reset();
            bitmap.compress(Bitmap.CompressFormat.JPEG, quality, os);
            // 每次都减少10
            quality -= 10;
        }
        // 把压缩后的数据os存放到ByteArrayInputStream 中
        ByteArrayInputStream is = new ByteArrayInputStream(os.toByteArray());
        // 把 ByteArrayInputStream 数据生成图片
        Bitmap newBitmap = BitmapFactory.decodeStream(is, null, null);
        return newBitmap;
    }
  1. 根据图片的尺寸压缩。
    1、设置解码方式(inPreferredConfig ):ARGB_8888(默认)、ARGB_4444、ARGB_565、ALPHA_8。
    2、设置图片缩放比例:缩放比例 = 1 / inSampleSize(inSampleSize<1?1:inSampleSize)。
    // 对图片尺寸进行压缩
    public static Bitmap compressBitmap(Bitmap bitmap,int width,int height){
        ByteArrayOutputStream os = new ByteArrayOutputStream();
        // 质量压缩方法,这里100表示不压缩,把压缩后的数据存放到 os 中
        bitmap.compress(Bitmap.CompressFormat.JPEG, 100, os);

        // 把压缩后的数据os存放到 ByteArrayInputStream 中
        ByteArrayInputStream is = new ByteArrayInputStream(os.toByteArray());

        BitmapFactory.Options options = new BitmapFactory.Options();
        options.inJustDecodeBounds = true;
        // 解码方式
        options.inPreferredConfig = Bitmap.Config.ARGB_8888;
        BitmapFactory.decodeStream(is, null, options);
        // 缩放比例
        int inSampleSize = calculateInSampleSize(options, width, height);
        options.inSampleSize = inSampleSize;
        options.inJustDecodeBounds = false;

        is = new ByteArrayInputStream(os.toByteArray());
        Bitmap newBitmap = BitmapFactory.decodeStream(is, null, options);
        return newBitmap;
    }

    public static int calculateInSampleSize(BitmapFactory.Options var0, int var1, int var2) {
        int var3 = var0.outHeight;
        int var4 = var0.outWidth;
        int var5 = 1;
        if (var3 > var2 || var4 > var1) {
            int var6 = Math.round((float) var3 / (float) var2);
            int var7 = Math.round((float) var4 / (float) var1);
            var5 = var6 > var7 ? var6 : var7;
        }

        return var5;
    }
  1. 设置图片缓存。
    1、优化原因:重复加载图片消耗资源(CPU、内存、流量)。
    2、优化方案:1、三级缓存:内存缓存->本地缓存(数据库、文件)->网络缓存。2、软引用(SoftReference,内存不足回收对象)。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值