libjpeg哈夫曼算法压缩图片

这篇博客探讨了Android图片压缩的不足,并指出Android的skia压缩算法采用了libjpeg,但未启用哈夫曼优化以避免性能问题。作者建议手动编译libjpeg并启用哈夫曼算法,提供了编译好的库和示例代码,展示了如何在项目中使用该库进行更高效的图片压缩。文章还提及了libjpeg库的局限性和不同CPU架构的兼容性问题。
摘要由CSDN通过智能技术生成

之前的博客提到过关于图片压缩的方法: Android 图片压缩,Bitmap优化


Android原生的压缩方法,不在乎两种:通过设置simpleSize根据图片尺寸压缩图片;通过Bitmap.compress方法通过压缩图片质量,去压缩。但是我们当我们对图片质量和图片文件大小同时存在要求时,我们发现无论怎么去设置参数,我们所做的效果总是不能尽如人意,而且同样大小的图片,效果却总是比iOS的效果差很多。

其实归根到底的是iOS和Android的压缩算法存在一些差异。

Android所用的是skia的压缩算法,它在google的很多地方,比如chrome、Android等都有使用,而Bitmap的压缩算法就是通过这个实现。而Skia是libjpeg进行了封装,google在实现skia时对其中一个地方进行了修改:通过哈夫曼算法来进行图片压缩,但是采用这个算法的时候,机器可能会出现性能问题,于是并没有调动这个方法。

[plain]  view plain   copy
  在CODE上查看代码片 派生到我的代码片
  1. boolean optimize_coding   
  2. TRUE causes the compressor to compute optimal Huffman coding tables   
  3. for the image. This requires an extra pass over the data and   
  4. therefore costs a good deal of space and time. The default is   
  5. FALSE, which tells the compressor to use the supplied or default   
  6. Huffman tables. In most cases optimal tables save only a few percent   
  7. of file size compared to the default tables. Note that when this is   
  8. TRUE, you need not supply Huffman tables at all, and any you do   
  9. supply will be overwritten.  
但是,这个问题在十年前或许存在,但是现在的机器已经完全可以解决性能问题,而google却忘记了更正当年的代码。


接下来,我们就自己去编译生成libjpeg的动态库,然后调用。

github中android libjpeg的源文件地址:https://github.com/libjpeg-turbo/libjpeg-turbo

这个我们需要自己去编译,但是已经有人帮我们编译好了,压缩算法也已经实现,因此,我们去下载然后编译即可:https://github.com/bither/bither-android-lib


首先将上面下载好的已经编译好的libjpeg放到jni目录下,将下图内容都放到jni目录中:


安装好ndk以后,直接输入ndk-build即可。

接下来就会编译生成arm下的动态库,使用的时候必须在项目中新建一个包net.bither.util,然后加入下面这个类方法,也就是使用了libjpeg开启哈夫曼算法的压缩算法:

[java]  view plain  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值