WebP 中的无损和透明度编码
摘要
我们将 WebP 编码器和解码器在 PNG 和无损模式下的资源用量进行比较。我们使用 12000 张从网络中随机选择的半透明 PNG 图像集合,并采用更简单的测量方式来显示性能变化。我们重新压缩了语料库中的 PNG,以将 WebP 图片与大小优化的 PNG 进行比较。我们的结果表明,对于文件大小和处理速度,WebP 可以很好地替代 Web 上用的 PNG。
简介
WebP 支持无损且半透明的图片,这使得它成为 PNG 格式的替代方案。PNG 压缩中使用的许多基本技术(如字典编码、霍夫曼编码和颜色索引转换)在 WebP 中也受支持,在最糟糕的情况下,这会导致类似的速度和压缩密度。同时,许多新功能(例如不同颜色通道的单独熵代码、反向参考距离的 2D 局部性以及最近使用的颜色的颜色缓存)可以提高大多数图片的压缩密度。
在这项工作中,我们比较了 WebP 与使用 pngcrush 和 ZopfliPNG 经过高度压缩的 PNG 的性能。我们使用最佳实践重新压缩了网络图片参考资料库,并将无损和有损 WebP 压缩与此资料库进行比较。除了参考资料库之外,我们还针对速度和内存使用基准化分析,选择了两张较大的图片(一张是照片,另一张是图片)。
事实证明,解码速度比 PNG 更快,并且压缩效果比目前的 PNG 格式要压缩 23%。我们得出结论,WebP 可以更有效替代当前的 PNG 图片格式。此外,支持无损 Alpha 值的有损图片压缩在提升网站速度方面提供了更多可能。
方法
命令行工具
我们使用以下命令行工具来衡量性能:
- cwebp 和 dwebp。这些工具是 libwebp 库的一部分(从头编译)。
- 转化。这是 ImageMagick 软件的命令行工具 (6.7.7-10 2017-07-21)。
- pngcrush 1.8.12(2017 年 7 月 30 日)
- ZopfliPNG(2017 年 7 月 17 日)
我们使用命令行工具及其各自的控制标志。例如,如果我们引用 cwebp -q 1 -m 0,则意味着已使用 -q 1 和 -m 0 标记调用 cwebp 工具。
图片分类
已选择三个语料库:
- 单张照片(图 1),
- 一张半透明的图形图片(图 2),以及
- 网络语料库:从互联网随机挑选的 12000 张随机生成的 PNG 图片(半透明或半透明)。这些 PNG 图片通过转化、pngcrush、ZopfliPNG 进行优化,且在研究中会考虑每张图片的最小版本。
图 1. 摄影图片,1024 x 752 像素。火焰呼吸 “Jaipur Maharaja Brass Band”作者:Chassepierre 比利时公司,作者:Luc Viatour,图片已获知识共享许可 - 署名 - 相同方式共享 3.0 未移植许可。作者网站请点击此处。
图 2. 图形图片,1024 x 752 像素。来自 Google 图表工具的拼贴图片
为了衡量现有格式 PNG 的全部功能,我们使用几种方法重新压缩了所有原始 PNG 图片:
- 每个组件固定到 8 位:转换 input.png -depth 8 位输出.png
- 不带预测器的 ImageMagick(1):conversion input.png -quality 90 output-candidate.png
- 使用自适应预测器的 ImageMagick:conversion input.png -quality 95 output-candidate.png
- Pngcrush(2):pngcrush -brute -rem tEXt -rem tIME -rem iTXt -rem zTXt -rem gAMA -rem cHRM -rem iCCP -rem sRGB -rem alla -rem text input.png input-png
- ZopfliPNG(3): zopflipng --lossy_transparency input.pngoutput-candidate.png
- 包含所有过滤条件的 ZopfliPNG:zopflipng --迭代 s=500 --filters=01234mepb --lossy_8bit --lossy_transparency input.pngoutput-candidate.png
成效
我们计算了网络库中每张图片的压缩密度(相对于优化了三种效果的 PNG 图片大小):
- WebP 无损(默认设置)
- 尺寸最小的无损 WebP (-m 6 -q 100)
- 最佳的 WebP 无损和 WebP 有损与 alpha(默认设置)。
我们对这些压缩系数进行排序,并将其绘制在图 3 中。
图 3. PNG 压缩密度用作参考,1.0。无损和有损方法均压缩了相同的图像。对于每张图片,系统会计算与压缩 PNG 的大小之比,并对大小比进行排序和显示无损压缩和有损压缩。对于有损压缩曲线,在生成较小的 WebP 图片的情况下,选择无损压缩。
对于 libpng,最高质量 (convert) 以及 ZopfliPNG(表 1)的 WebP 已超出 PNG 压缩密度,而编码(表 2)和解码(表 3)的速度与 PNG 大致相当。
表 1. 使用不同压缩方法时的三个语料库的平均每像素位数。
图片集 | 转化质量 95 | ZopfliPNG | WebP 无损 -q 0 -m 1 | WebP 无损(默认设置) | WebP 无损 -m 6 -q 100 | WebP 有损与 alpha |
---|---|---|---|---|---|---|
相册 | 12.3 | 12.2 | 10.5 | 10.1 | 9.83 | 0.81 |
血腥 : 露骨 | 1.36 | 1.05 | 0.88 | 0.71 | 0.70 | 0.51 |
web | 6.85 欧元 | 5.05 | 4.42 美元 | 4.04 | 3.96 欧元 | 1.92 欧元 |
表 2. 压缩语料库和不同压缩方法的平均编码时间。
图片集 | 转化质量 95 | ZopfliPNG | WebP 无损 -q 0 -m 1 | WebP 无损(默认设置) | WebP 无损 -m 6 -q 100 | WebP 有损与 alpha |
---|---|---|---|---|---|---|
相册 | 0.500 秒 | 8.7 秒 | 0.293 秒 | 0.780 秒 | 8.440 秒 | 0.111 秒 |
血腥 : 露骨 | 0.179 秒 | 14.0 秒 | 0.065 秒 | 0.140 秒 | 3.510 秒 | 0.184 秒 |
web | 0.040 秒 | 1.55 秒 | 0.017 秒 | 0.072 秒 | 2.454 秒 | 0.020 秒 |
表 3. 使用不同方法和设置压缩的图片文件的三个语料库的平均解码时间。
图片集 | 转化质量 95 | ZopfliPNG | WebP 无损 -q 0 -m 1 | WebP 无损(默认设置) | WebP 无损 -m 6 -q 100 | WebP 有损与 alpha |
---|---|---|---|---|---|---|
相册 | 0.027 秒 | 0.026 秒 | 0.027 秒 | 0.026 秒 | 0.027 | 0.012 秒 |
平面设计 | 0.049 秒 | 0.015 秒 | 0.005 秒 | 0.005 秒 | 0.003 | 0.010 秒 |
web | 0.007 秒 | 0.005 秒 | 0.003 秒 | 0.003 秒 | 0.003 | 0.003 秒 |
内存性能分析
对于内存性能分析,我们记录了 /usr/bin/time -v 报告的最大居住集大小。
对于网络语料库,最大的图片本身就决定了最大内存使用量。为了更好地定义内存测量,我们使用单张照片(图 1)来概述内存使用情况。而相应的图形图片也会显示类似的结果。
我们分别在 -q 0 -m 1 和 -q 95(默认值为 -m)下测量了 libpng 和 ZopfliPNG 的 10 到 19 MiB,以及 WebP 无损编码的 25 MiB 和 32 MiB。
在解码实验中,convert -resize 1x1 对 libpng 和 ZopfliPNG 生成的 PNG 文件使用 10 MiB。使用 cwebp 时,WebP 无损解码使用 7 MiB,而有损解码使用 3 MiB。
总结
研究表明,编码和解码速度与 PNG 相同。编码阶段内存使用量的增加,但解码阶段显示健康的下降情况,至少是比较 cwebp 和 ImageMagick 的转化行为时。
压缩率更适合超过 99% 的网页图片,这表明用户可以相对轻松地将图片从 PNG 更改为 WebP。
使用默认设置运行 WebP 时,其压缩率比 libpng 高 42%,比 ZopfliPNG 好 23%。这表明 WebP 承诺可加快处理包含大量图片的网站。