Blog · 指南

无损图像压缩到底是如何工作的

为什么更小的文件能与原图逐像素完全一致——揭秘背后的预测、建模与熵编码技巧。

in == out · fewer bytes

“无损”听起来像个矛盾说法:文件怎么可能在不丢弃任何东西的情况下变小?秘诀在于图像中充满了<b>冗余</b>,而压缩就是用更少的比特描述同样像素的艺术。解码之后,你会精确地得到每一个原始值——逐位还原。

“无损”到底是什么意思

像 JPEG 这样的有损格式会丢弃那些你的眼睛大概率注意不到的信息。无损压缩则<i>什么都不丢弃</i>:解码后的图像与输入完全一致。这就是为什么它是截图、线稿、Logo、UI 素材和归档母版的正确选择——在这些场景里,哪怕一个像素的偏移都算是 bug,而不是舍入误差。

第一步:更好地建模数据

原始像素本身是浪费的,因为相邻像素高度相关——左边的像素通常就是对当前像素相当不错的猜测。无损编解码器会根据相邻像素<b>预测</b>每个像素,只存储很小的误差(残差)。PNG 把这称为<i>滤波器</i>(Sub、Up、Average、Paeth);预测越准,残差就越集中在零附近,而零值压缩起来效果极好。

第二步:熵编码

一旦数据大多变成了微小且重复的残差,<b>熵编码器</b>就会给常见值分配短编码、给罕见值分配长编码。PNG 使用 DEFLATE(LZ77 + 霍夫曼编码);WebP 无损模式和 JPEG XL 等现代编解码器则使用带上下文建模的算术编码或 ANS 编码,能更逼近理论极限。格式各不相同,但思路是一致的:在可预测的部分花更少的比特。

工具
作用
oxipng
尝试各种 PNG 滤波器组合 + 重新压缩 DEFLATE
zopfli
更慢的 DEFLATE,能找到更小的数据流
WebP -lossless
预测 + 颜色变换 + 算术编码
JPEG XL -d 0
压缩比最佳;还能转码 JPEG

工具从哪里发力

这就是为什么同一张图片生成的两个无损 PNG 文件大小可能天差地别:像素完全相同,只是编码器为描述它们付出了更多努力。<b>oxipng</b> 会搜索各种滤波器策略并重新压缩;<b>zopfli</b> 是一种慢得多的 DEFLATE,通常能再省下几个百分点;WebP 和 JPEG XL 则完全采用了更聪明的模型。它们都不会碰任何一个像素。

# 无损,最大努力值——像素完全相同,文件更小
imageforge logo.png --lossless --effort max
imageforge ui-export.png --convert webp --lossless

诚实地说说局限

无损压缩有其下限。真实场景的照片携带着真正的高频细节(传感器噪点、细腻纹理),这些内容本就难以被准确预测,因此无损压缩在这类图像上收益有限——这正是有损格式发挥价值的地方。但对于平面、合成或文字密集型图像,无损压缩通常能在零画质损失的情况下砍掉 30%–70% 的体积。关键的本领,就是判断你的图像属于哪一类。

在不动一个像素的前提下,压缩你的 PNG。

ImageForge 会在本地为你运行 oxipng、zopfli 和现代无损编码器。

继续阅读