分享

Google开源JPEG压缩算法

 quasiceo 2017-04-16

Google开源JPEG压缩算法--Guetzli体验

Google最近开源了一种新的JPEG图片的压缩算法,称使用 Guetzli 压缩的 JPEG 图像文件比使用现有的方法小 20%~30%。由于项目最近正在研究图片的后期处理功能,所以马上体验了一下。

环境介绍

机型 MacBook Pro (13-inch, 2016, Four Thunderbolt 3 Ports)
处理器 2.9 GHz Intel Core i5 双核4线程
内存 8 GB 2133 MHz LPDDR3


环境安装

1.推荐使用Homebrew安装,可省去编译过程,直接在Mac Terminal上体验算法。如本机没有Homebrew,可使用如下命令安装

/usr/bin/ruby -e “$(curl -fsSL https://raw./Homebrew/install/master/install)”
Homebrew官网:https:///index_zh-cn.html

2.安装Homebrew成功之后,即可通过如下命令安装Guetzli

brew install guetzli

tips:如对git比较熟悉可通过git clone命令获取算法源码,通过make编译过后即可生成相应的bin文件


参数介绍

1.Guetzli的使用非常简单,共有四个参数

–verbose 打印Guetzli算法的处理过程
–quality 设定图片压缩质量85~100,默认为95.
–memlimit 由于Guetzli算法非常占用内存,可通过此命令设定算法占用内存上限,默认为6G。
–nomemlimit 取消内存限制

e.g. 将目录下a.jpg以90的质量压缩为b.jpg,显示操作记录,则命令如下

guetzli –quality 90 a.jpg b.jpg

2.Guetzli算法性能,按照官方文档说法,算法运行的cpu时间和占用内存(不设上限)均与所处理图片的像素相关。平均每1MPix处理的cpu时间为1min,占用内存约为300M。

图片像素的计算方式,以1920*1080像素的图片为例,它对应1920*1080/1024/1024=1.97MPix. 故而处理该图片大约需要占用600M内存进行2min的压缩。


性能实测

图片尺寸 压缩质量 cpu时间(s) 内存占用(M)
2048*2048 85 330 900+
1024*1024 85 86 200+
512*512 85 17 60+
100*100 85 0.5 1+

我们可以看出,cpu时间与官方文档基本相符,在处理大图时可能时间会有所增长,而内存占用相比较来说会比官方介绍偏低,cpu占用率则一直是单核满载。

总体来说,该算法

1. 对于cpu资源的占用率极高,按照实测情况,每个Guetzli任务对于cpu100%单核占用,则同时进行的Guetzli任务受到物理机内核数严重制约,并发处理能力较弱;  
2. 对于内存资源的占用率偏高,Guetzli任务是个内存消耗大户,按照官方文档及测试结论,16G内存只够处理55MPIX,也就是同时处理30张以内的1920*1080像素的图片。   
3.  Guetzli算法整体运行时间偏长,压缩20K左右的图片需要8s左右,而对于高像素图片,动辄上百K甚至几兆的图片,其处理时长显然是同步处理不能接受的。

压缩效果

性能测试完成后,下面我们来看一下图片的压缩比以及压缩效果。从网上挑选不同尺寸的图片进行压缩测试,测试结果如下。

图片尺寸(px) 原始大小(kb) 处理时长(s) 压缩大小(kb) 压缩比
1024*837 59 28 49 16.95%
1024*704 62 32 56 9.68%
1280*720 126 41 107 15.08%
1680*1050 228 70 186 18.42%
1920*1080 232 106 186 19.83%
1938*1098 156 73 130 16.67%
3840*2160 1434 520 1211 15.55%
1920*1080(png) 2600 143 270 89.62%

上面的测验结果可以看出,对于不同图片,Guetzli算法的压缩比也不同,但是10%以上的压缩比还是可以保证的。至于,为何测试中没有出现官方文档中提及的20%~30%的压缩比(已有博客证实了该压缩比确定可得),猜想原因可能有如下两点:

 1.  由于图片来源是网络,所以可能相关的图片网站已经对图片进行了一次压缩,导致压缩比没有达到预期效果。
 2.  得到较好的压缩比需要某些特定类型的图片,例如官方文档中提及的高质量的图片效果相对更好。  
 3. 官方文档如是说“Note that Guetzli is designed to work on high quality images. You should always prefer providing uncompressed input images (e.g. that haven't been already compressed with any JPEG encoders, including Guetzli). ”

此外,可能大家已经注意到最后一条压缩记录,压缩比高达89%,原因是

1. 该图片为png类型的图片,而Guetzli算法针对的是jpeg图片进行压缩,官方文档中的说法是“sRGB profile with a gamma of 2.2”,而png图片除了rgb通道还有alpha通道,猜测可能是因为压缩算法的输出是jpeg,因此将alpha通道进行了过滤,才有如此高的压缩比。  
2.  jpeg图片本身就是有损压缩的格式,而png是无损压缩的格式,因此用png图片做测试有更高的压缩空间。  

alpha通道:阿尔法通道是一个8位的灰度通道,该通道用256级灰度来记录图像中的透明度信息,定义透明、不透明和半透明区域,其中白表示不透明,黑表示透明,灰表示半透明。

正是因为jpeg图片没有alpha通道,因此它不支持透明效果。

css中的颜色属性值rgba中的a也是指的alpha通道。

tips:透明的png图片经过压缩后,透明部分会变为黑色,这也是由于损失了alpha通道导致的。


压缩对比

对于如下图片,我们一起来看看压缩后的效果。

这里写图片描述

以算法支持的最低质量85进行压缩后的,图片对比
这里写图片描述

可以看出,压缩后的效果还是很不错的,一些细节部分也得到了很好的保留。


结论

1.Guetzli算法本身设定的最低质量为85(如要更低的质量需要修改源码),以算法接受的最低质量85来压缩图片,新图质量不会有明显差异,而且图片的压缩比例也相对客观。

2.Guetzli算法压缩锁的图片兼容性极佳,压缩后的图片可在现有web端直接使用。

3.Guetzli算法效率很差,并且对系统资源要求较高,图片越大处理越慢,基本上在线的图片压缩不可采用该算法。

4.Guetzli算法支持的压缩类型目前仅为jpeg,也即是sRGB模式的图片,如带有其他通道的图片,压缩后会带来各种问题。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多