Google Guetzli是如何压缩图片的?

译者注: 本文介绍了Google的图片压缩软件Guetzli,并通过一些测试指出了该软件的使用注意点。

cover

你可能已经知道,现在网页文件的平均大小比Doom游戏的安装文件还还大。

文件变大的原因之一是图片的增加,并且还需要支持更高的分辨率。

Google来拯救了

Google刚刚发布了一种新的JPEG压缩算法:Guetzli。该算法的主要思想是重点保留人眼可以轻松识别的细节,同时跳过眼睛无法注意的细节。

我不是专家,但预期的结果是获得一个感知质量相同,但文件大小更小的图像。

这不是一种新的图像格式,而是一种压缩JPEG图像的新方法。这意味着不需要一个定制的图像查看器,而是可以由任何一个能渲染JPEG的软件来显示。

现实生活中Guetzli

在我的一个项目中,有一个包含很多图片的主页(仅主页就有大约30Mb,其中27M是图片)。

我决定给Guetzli一个尝试的机会,为了说服我们的产品所有者和设计师质量损失是可以接受的,我试着把这个新的算法应用在一张没有使用的高分辨率的图片上(一张8574×5715,22MB的JPEG图片) 。

它崩溃了。

根据google所说(并且我的经验证实了这些数字),Guetzli每一百万像素的图像大约需要占用300MB的内存(因此,我的图像大约需要15GB),而当时我没有这么大的内存(六个节点服务器,两个docker容器,chromium和几个electron实例所占用的内存使得我的电脑不符合要求)。

在清理了一些不重要的进程之后,我重新试了一次,Guetzli占用了12GB的内存,但是成功了。

Google还表示,Guetzli处理一张图片每一百万像素大概需要一分钟的时间,我差不多也花了这么多时间(总时间略超过40分钟)。

压缩后的图像不到7MB(原始大小为22MB),我无法通过肉眼来确定哪个是压缩过的(我们的设计师可以,但是承认差异“小到令人难以置信”)。

6.9M    home-guetzli.jpg
22M     home-raw.jpg

我使用的是Guetzli默认的品质设置(从84到100,如果要低于84,你需要自己编译并更改这个最小值)进行的压缩。

更多的测试以及一些成功的例子

然后,我决定为该图像尝试使用不同的品质设置(我写了一个非常简单的脚本,从而无需每40分钟重新启动一次,并且在我睡觉的时候也能够运行)。

结果在这里(Guetzli的默认品质因素似乎是95)。

6.9M    ./home-guetzli.jpg
22M     ./home-raw.jpg
3.0M    ./home-raw.jpg.guetzli84.jpg
3.4M    ./home-raw.jpg.guetzli87.jpg
4.2M    ./home-raw.jpg.guetzli90.jpg
5.5M    ./home-raw.jpg.guetzli93.jpg
8.8M    ./home-raw.jpg.guetzli96.jpg
18M     ./home-raw.jpg.guetzli99.jpg

产品所有者和设计师均同意使用84这个品质因素。然后我转换了所有的图片,我们从主页从30MB变为不到8MB(其中3MB是CSS和脚本)。

应该注意到的是,我们的图片之前并没有进行任何形式的压缩。

附加说明

在我的机器上安装Guetzli很顺利(有人在archlinux上创建了一个包含Guetzli的AUR包,非常感谢这个人),并且可以直接运行它(只要你拥有足够的内存)。

似乎还有一个brew包(针对Mac OS用户),但是我没有测试它。

对于超大的图片,Guetzli需要占用大量的内存和CPU时间(很多时候是相对的,不要指望着在运行的时候能够做其他事情)。如果RAM不是你的瓶颈,那你甚至可以考虑针对不同的图片并行运行多个Guetzli实例,因为它仅占用一个核心(仅作为写入)。

作为一个JPEG编码器,它不能输出PNG(因此没有透明度),但它可以转换和压缩PNG图片。
运行效率与图片的初始质量有关:我注意到压缩比范围大约为大图像上的7倍到小图像上的2倍之间。在小图片上,质量损失也更加明显。

在少数情况下,我也发现色饱和度存在损失(在我这个案例中,这个是可以接受的)。

长话短说

给Guetzli一个尝试,它可能会给你一个不可接受的结果(特别是低品质),但它也会让你的网站减少几MB的大小。

谷歌在开源社区发布了一款最新的JPEG图片编辑器Guetzli,其压缩能力强大。 ­  谷歌表示,Guetzli在将无损图片转换成JPEG格式的过程中,步骤与传统编辑器(如:libjepg)无异,但通过新型算法对图片的色彩和细腻度进行了优化,从而在画质与文件体积方面取得了完美平衡。 Guetzli,在瑞士德语中是“cookie(曲奇)”的意思,是一个针对数码图像和网页图像的 JPEG 编码器,能够通过产生更小的 JPEG 文件来达到更快的在线体验,并且同时保持与当前浏览器,图像处理应用和 JPEG 标准的兼容性。Google 称 Guetzli 创建高质量的 JPEG 图像文件的大小比当前的压缩方法要再小 35%。 JPEG 图像的视觉质量与它的多阶段压缩过程有关:色彩空间变换,离散余弦变换,以及量化等等。Guetzli 具体针对量化阶段,图像视觉质量损失越多,输出图像尺寸越小。Guetzli 努力通过一个搜索算法,来克服 JPEG 格式的精神视觉模型与 Guetzli 的精神视觉模型之间的差别,以一种更全面更详细的方式来结合色彩感知和视觉掩蔽,从而在最小化损失和最小化图像尺寸中达到平衡。不过,尽管 Guetzli 可以使图像尺寸更小,但创建压缩图像所花费的时间要与目前的方法更长。 上图为 16x16 像素样本,是挂在蓝天下的一根电话线,传统 JPEG 算法经常会遇到的失真状况。左边是未压缩的原图,中间为较小尺寸的 libjpeg,右边是失真更少的 GuetzliGoogle 还表示在实验中把压缩图像的尺寸设为常数,相比于 libjpeg 输出的图像,在人工评估时大家总是更偏好 Guetzli 产生的图像,即使当 libjpeg 的图像和 Guetzli 的大小相同甚至更大一些。这点让他们觉得压缩速度慢一点也是值得的。       经笔者测试Guetzli压缩极其耗时,采用单线程,125KB的图片压缩耗时达2分钟。github也有一群用户抱怨压缩极慢,8M的图片耗时20分钟。 看来被广大开发者应用还得解决性能问题才行,这样的耗时很多人都无法接受。 标签:guetzli  libjepg  谷歌
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值