什么是无损压缩?
无损压缩是一种使文件变小的方法,因此它的传输或下载速度更快,但它可以被解压缩成完全相同的原始文件。ZIP和RAR是流行的无损文件格式,用于文件压缩。在网络环境中,GZIP压缩经常被用来使JavaScript和CSS文件变小。在图像压缩中,PNG是一种著名的无损格式。
无损压缩的另一个选择是有损压缩,这在压缩照片时经常使用。JPEG可能是最知名的有损图像格式。有损压缩会丢掉图像中的一些细节,这将导致文件大小大大缩小。由于大型照片在传输和存储时将过于庞大,失去一些质量往往是一个很好的权衡。
什么时候使用无损压缩?
虽然像JPEG和有损WebP这样的有损图像格式对照片来说是很好的,但它们对图形来说却不那么好。压缩的假象,如块状假象和模糊,在这些类型的图像上很容易看到并分散注意力。
无损压缩对于具有大面积连续色彩的图像来说是很好的,因为它们会使用无损压缩算法进行良好的压缩。你可以想到经典的运行长度编码(RLE)算法,它可以非常有效地压缩重复的数据,当然,这些格式使用的真正算法更加复杂。
因此,无损图像压缩对于像标志、屏幕截图、图表和图形这样的东西来说效果最好。与有损压缩相比,用无损压缩来压缩这类图像往往可以使文件尺寸更小,质量更好。

一个无损压缩效果良好的图像例子。作为PNG的回收符号占用了3千字节。相同文件大小的JPEG有明显的压缩伪影。具有最高质量的JPEG看起来和PNG一样,但它是PNG的8倍大。
选择一个数据集
为了测试无损压缩,我们首先需要一些图像。由于无损压缩对照片不是很有效,我们需要一些包含图形、标志和文字的样本图片。我最后从Dribbble下载了一组图片,这是一个为设计师提供的作品集网站。
大多数图片描绘了网站、移动应用程序、标志或插图。这些类型的图片非常适合无损压缩。我下载了大约100张最受欢迎的 “镜头”,或网站上的图片。
由于许多图片相当大,我把图片缩减到最大宽度为1000像素,这样压缩它们就不会花费太多时间。我还确保颜色空间是sRGB

来自Dribbble数据集的一些示例图片,图片版权:Mike | Creative Mints, Taras Migulko , Enes Aktaş , Max Panchyk , Mike | Creative Mints , Tran Mau Tri Tam , DStudio, Brad Cuzen , Melissa Miyamoto-Mills ,你可以在这里下载测试图片。
要测试的文件格式
我决定测试以下图像格式。PNG、无损WebP、AVIF和JPEG XL。所有这些都可以在今天的浏览器中使用,除了JPEG XL,它在Chrome和Firefox中被支持,但首先必须使用一个功能标志来启用。在这些浏览器的即将到来的版本中,JPEG XL可能会被默认支持。
所有这些文件格式都有一个编码速度的选项。通过指定一个低速,编码需要更长的时间,但产生的图像会更小。在高的编码速度下,情况正好相反。我在所有的例子中都使用了最慢的速度,以便从图像格式中获得最大的好处。
PNG
PNG是Portable Network Graphics的缩写。它是最古老的网络图像格式之一,于1996年首次发布。它最初是作为GIF格式的替代品而开发的,GIF格式在当时是有专利的。与GIF相比,PNG包括许多优点,包括全24位颜色(每通道8位)和一个alpha通道。GIF格式被限制在每幅图像256种颜色和单一透明色。
PNG文件格式是基于DEFLATE压缩算法,并有一个特殊的过滤器设置,可以预测颜色值。这导致了几个PNG优化工具的发展,它们测试不同的压缩设置,以尽量减少文件大小。一些最著名的是PNGOUT,OptiPNG,和基于Rust的OxiPNG。也可以把通常的DEFLATE压缩换成谷歌的Zopfli压缩,它与DEFLATE兼容,但以更长的压缩时间为代价实现了更高的压缩率,PNG格式被所有的浏览器所支持。
我使用OxiPNG v5.0.0压缩PNG文件,使用最大可能的优化级别,命令如下。oxipng /path/to/input/image.png --out /path/to/output/image.png --opt max --strip safe
我还用Zopfli压缩法对同一组图片进行了优化,这需要很长的时间,但得到的文件更小。oxipng /path/to/input/image.png --out /path/to/output/image.png --opt max --strip safe --zopfli
WebP
谷歌在2010年推出了WebP,作为一种有损图像格式,基于VP8视频编解码器。2012年发布的WebP 0.3引入了无损模式,这与VP8编解码器无关。虽然有损WebP仅限于4:2:0色度子采样,放弃了一些颜色信息,但无损WebP将保留所有原始图像数据。
除了有损和无损模式外,WebP还支持 “近乎无损 “模式,但我在本文中没有测试。这样的选项在某些情况下可能是有用的,但我一般不觉得它有用,因为我宁愿在无损和有损编码之间选择,而不是在两者之间选择。
直到最近,苹果的Safari浏览器是唯一的WebP坚持者。从2021年起,WebP现在被所有主要浏览器所支持。
对于WebP,我使用了官方的cwebp工具,版本1.2.0。为了达到最佳压缩效果,我将质量定义为100,方法为6:
cwebp /path/to/input/image.png -o /path/to/output/image.webp -q 100 -m 6 -lossless
AVIF
AVIF是AV1图像文件格式AV1_Image_File_Format_(AVIF)的缩写。它是一种新的图像格式,以AV1视频编解码器为基础。它有许多先进的功能,如支持高比特深度和HDR。该格式同时支持无损和有损压缩。
最近版本的谷歌浏览器支持AVIF,在火狐浏览器中可以通过使用一个配置标志启用。
对于AVIF文件的编码,我使用了libavif的avifenc v0.9.1。我使用了尽可能低的速度来获得最佳压缩效果。
avifenc —lossless —speed 0 /path/to/input/image.png /path/to/output/image.avif
JPEG XL
JPEG XL是一种新的和即将到来的图像格式。JPEG XL是通过结合两种现有的图像格式而开发的,谷歌开发的Pik()图像格式和Cloudinary开发的FUIF(自由通用图像格式)。
cjxl命令行工具默认为基于Pik的格式,名为VarDCT,但是FUIF衍生的模块化模式可以通过在命令行上指定-modular标志来选择。JPEG XL 同时支持无损和有损压缩。
在Chrome和Firefox中支持JPEG XL,但它在默认情况下没有被启用。对该格式的支持必须通过使用一个特征标志来启用。
为了压缩JPEG XL文件,我使用了官方的cjxl工具,版本0.3.7_1。cjxl /path/to/input/image.png /path/to/output/image.jxl --modular --quality 100 --speed 9 -E 3
命令行标志是不言自明的,除了-E标志,我听说它代表了 “额外参数”。我使用了3的值,这被推荐为最佳压缩。使用这个选项可以从文件大小中减去几千字节,而图像的压缩时间则要长一点。
Results
以下是94张图片的结果。条形图描述的是结果的中位数,误差条说明的是第25和75个百分位数。你可以在这里看到电子表格中的完整数据(https://docs.google.com/spreadsheets/d/16nvtgkukhYpAnsSSLaXty0fbwZ8qKmFN-0VFhGp7i3w/edit?usp=sharing)。
File size

编码速度
我认为比较不同文件格式之间的压缩速度也是很有趣的。作为参考,编码是在我的2015年15′ MacBook Pro上完成的。

总结
看一下测试结果,底线是大多数现代无损图像格式,如WebP和JPEG XL,与最优化的PNG相比,在效率上有很大的提高。
PNG
用OxiPNG优化PNG可以使其略微变小,大约12%,这并不是一个巨大的差别。OxiPNG非常快,处理一张图片大约只需要700毫秒。
用OxiPNG的Zopfli设置使优化速度极慢,平均需要208秒左右,即三分半钟。与原始PNG相比,生成的文件小了约18%。我不建议使用Zopfli压缩,因为它耗费了大量时间,只能提供稍小的文件。较新的格式如WebP或JPEG XL能产生更小的文件,而且编码时间只是Zopfli的一小部分。
既然PNG的优化收益如此之小,而这个过程又需要如此多的时间,如果你能够使用更现代的格式,可能根本不值得优化PNG文件。即使没有优化,PNG仍然是源图像格式的一个好选择,因为它与大多数软件如图像编辑器和内容管理系统兼容。然后,你可以在向终端用户展示之前将原始PNG文件转换为更有效的格式。对于不能显示现代格式的客户端,如一些电子邮件客户端和旧的浏览器,PNG也可以是一种有用的后备格式。
WebP
WebP是无损图像的一个很好的选择,因为它在压缩效率方面很容易胜过PNG,平均有41%的小图像。它也被网络浏览器和其他软件广泛支持。WebP文件的编码速度也很快,只需3秒左右就能完成压缩。
AVIF
我不得不说,我对AVIF的表现有点失望。虽然有损的AVIF确实需要很长的时间来压缩,但与JPEG和WebP相比,它的压缩效果很好。遗憾的是,无损AVIF就不是这样了。
在无损模式下,编码一个AVIF文件平均需要30秒,但与其他竞争格式相比,其结果并不是那么好。在平均减少20%左右的情况下,产生的文件大小与Zopfli的OxiPNG相当,但与WebP或JPEG XL相比,明显要大一些。在使用AVIF时,我会坚持使用该格式最擅长的有损压缩。
JPEG XL
JPEG XL是街区的新孩子,给人留下了深刻的印象。平均文件大小减少了约48%,比WebP略好。当看到第75个百分点时,JPEG XL比WebP更有优势,这意味着JPEG XL在处理难以压缩的复杂图像方面做得更好。编码一个JPEG XL图像平均需要24秒左右,这是很慢的,但话说回来,我是故意使用最慢的设置的。
Wrap-up
虽然这些结果很有参考价值,但请记住,这些只是用有限的图片进行的一次测试的结果。当评估新的格式时,请使用你自己的测试数据,因为你可能最终会得到不同的结论。
这些测试也是在尽可能低的速度和尽可能高的压缩率下进行的。这在许多情况下是可行的,但有时你可能需要实时进行图像处理。在这种情况下,你需要使用更快的图像压缩设置来达到必要的速度。
无损图像压缩的前景看起来很光明。我们已经有了现代的图像格式,在压缩方面可以轻松击败PNG。此外,还有新的和令人兴奋的图像格式在路上,如JPEG XL,它可能会更好。