前言:在github的发现一个谷歌开源的jpeg格式图片的压缩工具,它可以在主观质量无损的条件下, 将jpeg图片减少20%~30%的码率,于是当时测试了一下压缩效果,图片质量95压缩率大概在20%~30%。我们司平台是漫画阅读app,整个app除了图片还是图片,特别是首页,用了大量的高清无码的图片,于是我想将guetzli用于首页漫画封面图片的压缩,但是guetzli并没有提供php的接口,所以当时的实现是将需要压缩的图片放入redis队列,创建一个进程在凌晨基本没有用户访问的时候通过exec调用guetzli工具对redis队列消费处理。(至于为什么要这样,请看下面网上大佬的测试报告)
以下数据引用自这篇博客:谷歌开源图片压缩算法Guetzli实测体验报告
Guetzli资源消耗:
官方文档说,1MPIX的图片处理需要消耗300M内存。
实测一个1MB大小1920x2560的图片,有4.9MPIX。理论消耗内存1474MB,实际消耗1009MB内存,实际与理论基本相符。由此看出这个工具是个内存消耗大户,60G内存只够处理200MPIX,也就是同时处理40张左右的1920x2560图片。
CPU消耗则一直是100%单核占用。当然实际使用多核机器可以同时跑多个进程。有多少核就能跑多少个guetzli任务。
压缩图片耗时跟图片大小程离散相关,图片越大,耗时越久
guetzli劣势:
由于guetzli时效性差,图片越大压缩时间越长,而且资源占用大,简直就是内存消耗大户。
guetzli优势:
实测对质量在90或以下的jpg图片,guetzli输出的新图质量不会降低。而实际压缩率能够达到平均压缩率29%。
兼容性比较好,输出的jpeg格式图片通用性非常高。没有webp、sharpp那种协议不兼容的困扰。
在客户端jpeg格式的图片编解码速度比其他私有协议快很多。
下面说说我们将要做的:
从github下载guetzli的源码编译后会生成一个guetzli的工具,以及一个静态库文件,我们需要做的就是创建一个php扩展调用这个静态库提供的压缩功能。
动态加载so模块:利用ext_skel工具编译生成so模块,修改php.ini文件,动态加载即可
静态编译:将编写的模块静态编译到PHP,需要重新编译PHP
面临的问题:
注:php扩展加载方式可以分为静态编译与动态加载。(区别在于,静态编译需要重新编译php才能使用扩展,动态加载是将php扩展编译成so动态库库,修改php.ini,php在运行时会动态加载,不需要重新编译php),我们这里需要将扩展编译成so动态库。
</