图片压缩

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)释放资源

第三方框架Luban(鲁班)压缩

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容