一张
也就是约 36 MB。可是真实照片里,蓝天相邻像素很像,墙面大面积平滑,颜色通道彼此相关;即使在文字边缘,出现什么差值也不是均匀随机的。图片压缩所做的事,是把这些可以预测的重复变成容易描述的符号,再决定哪些误差值得花 bits 保留。
本文不从格式排行榜开始,而是完整走一遍 encoder 与 decoder。我们会先构造一个完全可逆的压缩器,再允许它有控制地丢掉信息。走完以后,PNG、JPEG、WebP、AVIF、JPEG XL 与学习式 codec 就不再是几个孤立名字,而是对同一组问题的不同回答。
压缩前先明确:一张图片到底是什么
最简单的 raster image 是一个规则网格。每个位置保存若干 sample,例如 RGB 三个颜色通道;文件还需要说明宽高、bit depth、颜色空间、透明度与元数据。所谓「原始 36 MB」只计算了像素数组,并不意味着任何 .raw 文件恰好这么大。
压缩有三种常见目标:
- Lossless:解码后每个 sample 与原值完全相同,适合截图、线稿、索引图、需要继续编辑或数据必须精确的场景;
- Lossy:允许 sample 改变,以显著减少 bits,照片和网络媒体常用;
- Visually lossless:肉眼在给定观看条件下难以分辨差异,但它仍然是有损目标,不保证逐 sample 相同。
这一区分很重要。「看起来一样」不能推出「数据一样」;反过来,lossless 也不保证文件一定小。压缩率取决于图像里是否存在编码器能利用的结构。
第一步:不保存像素本身,保存它与预测的差
先只看一行 8-bit 灰度值:
若直接保存,每个数仍在 0 到 255 之间。现在约定第一个值原样保存,此后都用左边已经重建的值预测当前值:
得到
这一步没有减少元素数量,也没有丢失信息。Decoder 从
为什么 residual 会变成更少的 bits
如果仍给每个 residual 固定 8 bit,文件一点也没变小。真正利用这种集中分布的是 entropy coding:常见符号用短表示,罕见符号用长表示。一个概率为
分布的平均理论下界由 entropy 描述:
因此 prediction 和 entropy coding 分工不同。前者把原始数据改写成更偏斜、更容易建模的分布;后者才把概率优势兑现为较少 bits。Prediction 选得不好时,residual 可能更杂,甚至压得更差。
PNG 就沿着这条无损路线工作。每条 scanline 可以在 None、Sub、Up、Average 与 Paeth 五种可逆 filter 中选择一种,把像素改写成相对左侧、上方或邻域预测的差;随后 DEFLATE 再用 LZ77 匹配与 Huffman coding 压缩字节流 (World Wide Web Consortium, 2025)。Decoder 反向执行即可逐 sample 复原。PNG 不等于「任何图都压得小」:自然照片的细碎变化可能让无损 residual 仍然很复杂。
第二步:先把颜色放到更合适的坐标系
RGB 便于显示,却不总适合按视觉重要性分配 bits。照片与视频 codec 常把颜色变换为一个亮度样分量
真正减少样本的是 chroma subsampling。对一个
- RGB 或 YCbCr 4:4:4 都有
个 samples; - YCbCr 4:2:0 保留 4 个
,让四个位置共享 1 个 与 1 个 ,共 6 个 samples。
人类视觉通常对高频亮度变化比高频色度变化敏感,所以照片常能承受色度降采样。但文字、UI、像素画、彩色细线和继续编辑的素材可能出现明显 color bleeding。4:2:0 是有损操作;把 RGB 换成 YCbCr、却仍保留 4:4:4,则不能单凭名称断言有损。
第三步:把空间图样改写成频率
现在处理一个小图块。相邻像素往往一起缓慢变化,直接量化它们会分别制造误差。离散余弦变换(DCT)换一组基底描述同一块:一个系数表示整体平均,其他系数表示从水平缓变、垂直缓变到细密交替的不同空间频率。
对
其中
为什么要绕这一圈?一块平滑的像素需要很多相近数值描述,但在 frequency domain 中,能量常集中于少数低频系数。正交 DCT 仍输出
第四步:量化才真正决定丢掉什么
对每个 transform coefficient
较大的
下面的图使用同一份
JPEG 的 baseline sequential 流程正是这条经典路径:把图像分块,变换并量化,再让 DC difference 和按 zigzag 顺序排列的 AC coefficients 进入 run-length/Huffman coding (Joint Photographic Experts Group, n.d.)。Zigzag 让低频靠前、高频零更容易连成一段;entropy coding 只缩短符号表示,不会再改变重建画面。
把 decoder 写出来,有助于定位每种误差:
若 block 边界两侧的量化误差不连续,会看到 blocking;高频截断会在锐利边缘附近形成 ringing;色度降采样会让颜色越过边缘;低 bit depth 或过强低频量化可能产生 banding。所谓「压缩痕迹」不是一个单一现象,只有找到它来自哪一步,才知道该换 subsampling、quality、bit depth、encoder,还是格式。
常见格式在这条链上怎样选择
格式名称不是单独的质量旋钮。同一格式可以有多个 encoder、速度 preset、颜色配置与质量档;不同格式的 quality=80 没有共同刻度。更有用的比较是问它如何预测、在哪里有损、怎样建模概率,以及目标 decoder 是否可用。
| 格式 | 主要机制 | 是否有损 | 更适合先考虑的场景 |
|---|---|---|---|
| PNG | scanline filters + DEFLATE | lossless | UI、截图、线稿、精确 alpha、需逐 sample 保留 |
| JPEG | block DCT + quantization + entropy coding | 主要是 lossy;标准也定义其他模式 | 兼容性优先的照片交付 |
| WebP | VP8 intra prediction/transform;另有独立 lossless mode | 两者皆可 | 现代 Web 照片、透明图与动画,需核对工具链 |
| AVIF | HEIF 容器中的 AV1 image coding | 两者皆可 | 高效率照片、HDR/WCG、现代终端 |
| JPEG XL | lossy VarDCT 或 lossless Modular | 两者皆可 | HDR、渐进解码、专业图像或可控生态 |
WebP lossy 借用 VP8 的 intra prediction 与 transform coding,lossless 模式则使用不同的 reversible transforms、预测和 entropy coding (Google for Developers, n.d.)。AVIF 把 AV1 image content 封装在 HEIF 结构中,可表达 SDR、HDR、wide color gamut、多种 bit depth、静态图与 image sequence (Alliance for Open Media, n.d.)。JPEG XL 同时设计了面向照片的 VarDCT 与面向无损/一般数据的 Modular 路径,并支持 progressive decoding、alpha、HDR 和 legacy JPEG 的 bit-exact reconstruction (Joint Photographic Experts Group, 2023)。
这里故意不宣布一个永恒赢家。标准已经发布,不等于所有浏览器、操作系统、CDN、编辑器和硬件都已支持;兼容性也会随时间变化。实际交付要从 decoder 端倒推,并用自己的内容实测。
怎样公平比较两个 encoder
只比较文件大小没有意义:把一张图压到几乎看不清,当然很小。应在多个 rate 点编码同一组有代表性的图片,画 rate–distortion curve。常见 rate 是 bits per pixel:
Distortion 可以从 mean squared error 和 PSNR 开始:
但 PSNR 不完全代表感知质量。严肃比较还应加入结构或感知指标,并亲自检查人脸、文字、暗部渐变、强边缘、噪声与透明边界。至少固定或记录:encoder 名称和版本、preset、chroma format、bit depth、颜色管理、metadata 是否计入,以及 decoder 输出如何对齐。跨 encoder 比较一个同名 quality 数值,通常不是控制变量。
学习式图像压缩把哪些步骤变成了网络
经典 codec 由工程师规定 transform、quantization table 与概率上下文。学习式 codec 可以让 analysis transform 把图像映射到 latent,让 entropy model 学习 latent 的概率,再由 synthesis transform 重建:
若 entropy model 给出
训练目标仍是熟悉的 tradeoff:
JPEG AI 在 2025 年成为首个端到端学习式图像编码国际标准,目标同时覆盖人类观看与机器处理 (Joint Photographic Experts Group, 2025)。这说明 learned codec 已进入标准化阶段,却不意味着现有图片管线已自动迁移:模型复杂度、能耗、硬件加速、确定性、bitstream 互操作和长期 decoder 可得性仍然是部署的一部分。
实际选格式时,从约束倒推
可以依次回答:
- 能否丢信息? 像素级资产、医学/科学数据或继续编辑的中间件,先考虑 lossless;最终观看副本再评估 lossy。
- 图像是什么类型? 照片、截图、文字、透明 UI、像素画、HDR 和噪声丰富的素材需要不同策略。
- 谁来解码? 浏览器、App、打印管线、设计软件和归档系统的支持范围,通常比纸面压缩率更先决定答案。
- 是否需要额外能力? Alpha、animation、HDR、progressive loading、metadata 与 legacy JPEG reconstruction 都可能改变格式选择。
- 编码成本是否值得? 节省的存储与传输,要和 CPU/GPU 时间、能耗、延迟及维护复杂度一起算。
对于普通照片发布,先用目标平台稳定支持的现代 encoder 做真实内容测试,再保留必要 fallback;对于截图和图形,不要默认照片 codec 会更好;对于归档,除了 lossless,还要考虑开放规范、decoder 的长期可得性与校验策略。
进入视频压缩前,应该已经会什么
到这里,图片压缩可以浓缩成一条因果链:
继续读视频前,可以先确认自己能回答五个问题:
- 为什么 residual 元素并没有变少,却可能需要更少 bits?
- 为什么 RGB→YCbCr 不等于 4:2:0,后者又为什么有损?
- 为什么 DCT 输出同样多的 coefficients,仍然有助于压缩?
- 哪一步让 decoder 无法精确恢复原图,entropy coding 又为什么不改变画面?
- 为什么 encoder 与 decoder 必须使用相同的 prediction 依据?
如果这些问题都能沿着上面的数值例子讲清楚,就可以进入视频压缩。视频并不会另起炉灶:它保留 prediction、transform、quantization 与 entropy coding,只把「从同一张图的邻居预测」扩展成「从已经重建的其他帧预测」。新增的核心是 motion compensation、reference dependency、GOP 与跨帧 rate–distortion decision。