Android应用中怎么对图片进行压缩?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。
<强>为何要压缩强>
1,体积的原因
如果你的图片是要准备上传的,那动辄几米的大小肯定不行的,况且图片分辨率大于设备分辨率的话毫无意义。
2,内存原因
如果图片要显示下安卓设备上,ImageView最终是要加载图对象的,就要考虑单个位图对象的内存占用了,如何计算一张图片的加载到内存的占用呢?其实就是所有像素的内存占用总和:
位图内存大?图片长度x图片宽x度单位像素占用的字节数
起决定因素就是最后那个参数了,位图# 39;常见有2种编码方式:ARGB_8888和RGB_565, ARGB_8888每个像素点4个字节,RGB_565是2个字节,一般都采用ARGB_8888这种。那么常见的1080 * 1920的图片内存占用就是:
1920 x 1080 x 4=7.9 M
<强>压缩原理强>
从上面可以总结出,图片压缩应该从两个方面入手同时进行:先是降低分辨率,然后降低每个像素的质量也就是内存占用。
<强>分辨率压缩强>
假设有张原图是3840画素,我想压缩成1920 x1080,实际是不可能100%能压缩这个值的。因为图片压缩要保证宽高比,试想一下800 x100的横向图可能压成20 x200型竖向图吗?不可能的。。这里常见的算法就是在1920 x1080的范围内保证较短边,然后按照比例压缩整个图:
这里原图的宽高比是3840/2400=1.6,目标图的宽高比是1920/1080=1.78在1.6,较短边是高,所以就应该按照高的比例来压缩。
2400/1080=2.22,这样真实目标值就是:1728 x1080,压缩比四舍五入是:2,然后通过下面代码进行压缩:
矩阵scaleMatrix=新矩阵(); scaleMatrix。setScale (ratioX ratioY 0,0); 帆布画布=新画布(scaledBitmap); canvas.setMatrix (scaleMatrix); 画布。drawBitmap (bmp, 0, 0,新油漆(Paint.FILTER_BITMAP_FLAG));
用压缩机开源库压缩的图片对比下:
//进行有损压缩 ByteArrayOutputStream包=new ByteArrayOutputStream (); int options_=100; actualOutBitmap.compress (Bitmap.CompressFormat.JPEG options_、包);//质量压缩方法,把压缩后的数据存放到包中(100表示不压缩,0表示压缩到最小) int baosLength=baos.toByteArray . length (); 而(baosLength/1024比;maxFileSize) {//循环判断如果压缩后图片是否大于maxMemmorrySize,大于继续压缩 baos.reset ();//重置包即让下一次的写入覆盖之前的内容 options_=数学。马克斯(0,options_ - 10);//图片质量每次减少10 actualOutBitmap.compress (Bitmap.CompressFormat.JPEG options_、包);//将压缩后的图片保存到包中 baosLength=baos.toByteArray . length (); 如果(options_==0)//如果图片的质量已降到最低则,不再进行压缩 打破; }