返回

文章详情

无损GIF重压缩通过穷举搜索

Hacker News2026年6月23日 12:56

一点历史 GIF是最早广泛使用的压缩图像格式。今天,它主要因在图像文件中允许动画而闻名,但我对这种用途并不那么感兴趣。实际上,结果表明,这是唯一一个被NCSA Mosaic支持的图像格式。如果您的网站想要真正支持旧版浏览器,则必须对所有关键图像提供GIF备选。我不是在谈论旧版Chromium。我是说实际的Mosaic、Netscape、IE、Netsurf、Dillo、Konqueror - 你可以在oldweb.today上尝试这些浏览器。(您可能对支持它们不感兴趣,但这是一个有趣的练习。)我真的希望1-Click Linux网站在最旧的浏览器中看起来也能令人接受,因此我决定使用<picture>并回退到GIF。我相信每个现代网页功能如果在生产中使用,应该已经具有合理广泛的兼容性,然后只需一个回退,并且这个回退应该具有绝对1000%的兼容性。 问题 问题是,GIF压缩并不令人印象深刻。让我们面对现实吧,在2026年,您很可能只应该使用SVG和WebP(照片使用有损,适用于小调色板绘图/标志的无损)。不要用PNG,不要用JPEG,天哪,别用AI、DWG或任何其他专有格式(看着你,DICOM)。好吧,至少在网上(如其名称所示,WebP)。一个部分解决方案是使用小图像。真正的老设备屏幕尺寸非常小,如240x320的诺基亚手机。因此,图标或标志的回退可以安全地为128x128,因为256x256可能甚至无法适配屏幕。我们能做得更好吗?可以。存在一个专门用于图像优化的领域,首先需要去除元数据。然后我们可以从调色板中删除未使用的颜色,再从调色板中删除不常用的颜色,依此类推。但是上面没有一步提到实际的压缩! ZopfliPNG 我听说过zopflipng。PNG使用的是DEFLATE,这是一种从ZIP和GZIP中得知的压缩格式。这是带有哈夫曼编码的LZ77变种。在这种格式和其他常见的压缩格式中,有许多不同的方式来表示完全相同的未压缩数据。DEFLATE也是生成合理压缩输入的算法名称,您可以调整压缩所花费的时间,以期望实现更好的压缩(对于相同的数据,请记住?)。但是,有许多语法上有效的DEFLATE流并不会被DEFLATE算法产生,这很有趣,因为您可以制作一个ZIP文件包含自身,但无论如何,其中一些甚至比“最大压缩级别”更好。现在,Zopfli是执行穷举搜索的程序,跨越所有可能的语法有效流,以查找实际代表给定未压缩输入的最小比特数。然后ZopfliPNG是处理PNG的变体,也探索PNG像素编码。我们需要小心,因为找到任意格式的实际最佳压缩可能等同于解决停机问题。但我们今天讨论的压缩格式具有一些有用的不变量,保证搜索总是停止。 ZopfliGIF?没有ZopfliGIF,但有flexiGIF,它几乎完全做到这一点。这显然是一个很棒的工具,您应该在所有GIF上使用它。但问题是,GIF使用一种非常不同的压缩方案 - LZW。我在它的README中发现了一个令人困惑的评论,说明它可能会留下比原始算法更大的文件。这非常可疑。因此我开始进行了探索。‘它是由一个单独的人制作的——因此我也可以理解它。’我想。 LZW 然后我发现有点难以理解,因为像当时所有论文一样,原始描述必须围绕算法构建数据格式。但几十年后,我们已经知道这一点是错误的:对于我们这些关注互操作性的人来说,数据格式当然比算法更有趣。改变格式需要更改解码器软件。保持格式,更改编码器软件,并享受仍然使用相同的解码器。 兼容性。为了节省您的时间,让我为您描述一下:压缩流由动作组成,每个动作要么说“输出这个字节”,要么命名一个先前的动作并说“再次执行所有这些操作,但还要添加后续动作的第一个字节”。(选择最后一个动作的边缘情况很好,论文中称其为KwKwK。)(GIF还有一个“数据结束”动作和一个“清零状态”动作,但这与此无关。)简单吧?好吧,至少对我来说听起来简单得多。比通过阅读9行压缩伪代码和9行相应解压伪代码开始理解要简单得多。 然后算法可以简单地表达为贪婪方法,查看所有先前的动作,取最长的匹配后续内容的动作。这是双重合理的,

赞助内容

NordVPN Next-gen Antivirus

本站免费、广告极少。如果觉得有帮助,可以请我们喝杯咖啡 —— 任何金额都对持续运营有实际帮助。

请我喝杯咖啡