Android 图片质量压缩与尺寸压缩的区别

质量压缩一般可用于上传大图前的处理,这样就可以节省一定的流量,毕竟现在的手机拍照都能达到3M左右了,尺寸压缩一般可用于生成缩略图。

 

质量压缩并不改变图片像素,只是生成了压缩后的file读入流,以file形式占用内存时文件大小时缩小的,在重新变为bitmap后显示像素是不变的。(推测,微信的原图发送可能就是这原理)

质量压缩主要借助Bitmap中的compress方法实现:

public static byte[] bitmapBytes(Bitmap bitmap, int maxkb) {
   ByteArrayOutputStream output = new ByteArrayOutputStream();
   bitmap.compress(Bitmap.CompressFormat.PNG, 100, output);
   int options = 100;
   while (output.toByteArray().length > maxkb && options != 10) {
      output.reset(); //清空output
      bitmap.compress(Bitmap.CompressFormat.JPEG, options, output);//这里压缩options%,把压缩后的数据存放到output中
      options -= 10;
   }
   return output.toByteArray();
}

一般用于文件上传。

尺寸压缩主要用于从相册选择图片在界面上展示时生成缩略图使用:

public Bitmap createBitmap(String path, int w, int h) {
    try {
        BitmapFactory.Options opts = new BitmapFactory.Options();
        opts.inJustDecodeBounds = true;
        // 这里是整个方法的关键,inJustDecodeBounds设为true时将不为图片分配内存。
        BitmapFactory.decodeFile(path, opts);
        int srcWidth = opts.outWidth;// 获取图片的原始宽度
        int srcHeight = opts.outHeight;// 获取图片原始高度
        int destWidth = 0;
        int destHeight = 0;
        // 缩放的比例
        double ratio = 0.0;
        if(srcWidth<=w&&srcHeight<=h){
            return  BitmapFactory.decodeFile(path);
        }
        if (srcWidth < w || srcHeight < h) {
            ratio = 0.0;
            destWidth = srcWidth;
            destHeight = srcHeight;
        } else if (srcWidth > srcHeight) {// 按比例计算缩放后的图片大小,maxLength是长或宽允许的最大长度
            ratio = (double) srcWidth / w;
            destWidth = w;
            destHeight = (int) (srcHeight / ratio);
        } else {
            ratio = (double) srcHeight / h;
            destHeight = h;
            destWidth = (int) (srcWidth / ratio);
        }
        BitmapFactory.Options newOpts = new BitmapFactory.Options();
        // 缩放的比例,缩放是很难按准备的比例进行缩放的,目前我只发现只能通过inSampleSize来进行缩放,其值表明缩放的倍数,SDK中建议其值是2的指数值
        newOpts.inSampleSize = (int) ratio + 1;
        // inJustDecodeBounds设为false表示把图片读进内存中
        newOpts.inJustDecodeBounds = false;
        // 设置大小,这个一般是不准确的,是以inSampleSize的为准,但是如果不设置却不能缩放
        newOpts.outHeight = destHeight;
        newOpts.outWidth = destWidth;
        // 获取缩放后图片
        return BitmapFactory.decodeFile(path, newOpts);
    } catch (Exception e) {
        // TODO: handle exception
        return null;
    }
}

参数w,h是你想要的宽高,代码中可以看出来,图片原始宽高都小于你传入的宽高,那么就不压缩,否则就按比例计算缩放后的图片大小,maxLength是长或宽允许的最大长度。

 

项目开发中可以根据实际情况来做合适的压缩。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值