Android图片压缩常用的有质量压缩、尺寸压缩、采样率压缩以及通过JNI调用libjpeg库来进行压缩(尺寸压缩,质量压缩底层也是通过调用native的方法进行压缩的,而native是通过Skia这个库实现的,但最终还是调用了libjpeg库进行压缩的)
质量压缩
保持像素的前提下改变图片的位深及透明度(通过算法抹掉(同化)图片中的一些点附近相近的像素)达到降低质量压缩文件的目的
常用于将图片压缩后将图片上传到服务器,或者保存到本地,根据实际需求
尺寸压缩
通过减少单位尺寸的像素值,真正意义上的降低像素(通过缩放图片像素来减少图片占用内存大小)
常用于缓存缩略图的时候
采样率压缩
设置图片的采样率,降低图片像素。这样做不会先将大图读入内存,大大减少了内存的使用,也不必考虑将大图读入内存后的释放事宜
问题:因为采样率是整数,所以不能很好的保证图片的质量。如我们需要的是在2和3采样率之间,用2的话图片就大了一点,但是用3的话图片质量就会有很明显的下降
通过JIN调用libjpeg库压缩
通常IOS拍的照片1M左右还比Android拍出来的照片5M的还要清晰,都是在同一个环境下,保存的都是JPEG
原因
1995年 JPEG处理引擎,用于最初的在PC上面处理图片的引擎。
2005年 skia开源的引擎, 开发了一套基于JPEG处理引擎的第二次开发。便于浏览器的使用。
2007年安卓用的skia引擎(阉割版),谷歌拿了skia,去掉一个编码算法—哈夫曼算法。采用定长编码算法。但是解码还是保留了哈夫曼算法,导致了图片处理后文件变大了。
当时由于CPU和内存在手机上都非常吃紧 性能差,由于哈夫曼算法非常吃CPU,被迫用了其他的算法。
优化方案
绕过安卓Bitmap API层,来自己编码实现—-修复使用哈夫曼算法。
JIN开发步骤:
(1)将android的bitmap解码,并转换成RGB数据 一个图片信息---像素点(argb),alpha去掉
(2)JPEG对象分配空间以及初始化
(3)指定压缩数据源
(4)获取文件信息
(5)为压缩设置参数,比如图像大小、类型、颜色空间
(6)开始压缩——jpeg_start_compress()
(7)压缩结束——jpeg_finish_compress()
(8)释放资源