Android应用中怎么对图片进行压缩

  

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)); 

用压缩机开源库压缩的图片对比下:

 Android应用中怎么对图片进行压缩”> <br/> </p> <p>可以看出每次都能压缩到真实目标值。(注意不是目标值,注意区分目标值和真实目标值)</p> <p> <>强质量压缩</强> </p> <p>位图有个方法压缩(int CompressFormat格式,质量,OutputStream流),质量就是压缩质量传入0 - 100,数值越小压缩的越厉害。<br/> </p> <p>不过我们一般不直接设置这个数值,而是自定义一个压缩后大小比如300 kb,然后动态计算这个质量、核心代码:</p> <pre类=//进行有损压缩   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)//如果图片的质量已降到最低则,不再进行压缩   打破;   }

Android应用中怎么对图片进行压缩