技术

深入理解 JPEG 压缩算法:从 DCT 到熵编码

📅 2026-07-03 · ✍️ 闪压团队 · ⏱ 4 分钟阅读

JPEG(Joint Photographic Experts Group)是 1992 年发布的图像压缩标准,至今仍是互联网上最主流的图片格式之一。

30 多年过去了,JPEG 之所以经久不衰,在于它的算法设计既高效又优雅。本文带你从技术层面深入理解 JPEG 压缩原理。

JPEG 压缩的核心思想

JPEG 是有损压缩,核心思想是:

人眼对亮度变化敏感、对色彩细节不敏感 → 利用这个特性,可以丢弃大量"看不见"的信息

具体实现上,JPEG 算法分为以下几个步骤。

压缩流程(编码)


原始 RGB 图片
  ↓
颜色空间转换(RGB → YCbCr)
  ↓
色度下采样(4:2:0)
  ↓
分块(8×8 像素块)
  ↓
DCT 变换
  ↓
量化
  ↓
Z 字形扫描
  ↓
熵编码(Huffman / 算术编码)
  ↓
JPEG 比特流

步骤详解

1. 颜色空间转换:RGB → YCbCr


Y  =  0.299 × R + 0.587 × G + 0.114 × B    # 亮度
Cb = -0.169 × R - 0.331 × G + 0.500 × B + 128  # 蓝色色度
Cr =  0.500 × R - 0.419 × G - 0.081 × B + 128  # 红色色度

为什么要转?

因为 YCbCr 把"亮度"和"色度"分离了,可以独立处理。

2. 色度下采样(4:2:0)

把 Cb 和 Cr 的分辨率减半:

  • 原来:4 个像素有 4 个 Y、4 个 Cb、4 个 Cr
  • 现在:4 个像素有 4 个 Y、2 个 Cb、2 个 Cr(节省 50% 色度数据)

为什么可行?

人眼对色度变化不如亮度敏感,丢弃 50% 色度数据几乎看不出差别。

3. 分块(8×8 像素块)

把图片分成一个个 8×8 的小方块,每个块独立处理。

为什么是 8×8?

这是工程上的平衡:

  • 太小:分块数量多,开销大
  • 太大:压缩率降低
  • 8×8 是几十年来验证的最优值

4. DCT 变换(离散余弦变换)

DCT 是 JPEG 算法的核心

DCT 把 8×8 的像素值(空间域)变换成 8×8 的频率系数(频率域):


输入:8×8 像素值(0-255)
输出:8×8 频率系数(左上角是低频,右下角是高频)

为什么变换?

图像的大部分能量集中在低频部分(平滑区域),高频部分(细节、噪声)能量很少。变换后便于后续"扔掉"高频信息。

5. 量化(核心有损步骤)

用一张量化表对 DCT 系数做除法取整:


quantized = round(DCT_coefficient / quantization_table)

量化表长这样(标准亮度量化表):


16  11  10  16  24  40  51  61
12  12  14  19  26  58  60  55
14  13  16  24  40  57  69  56
14  17  22  29  51  87  80  62
18  22  37  56  68 109 103  77
24  35  55  64  81 104 113  92
49  64  78  87 103 121 120 101
72  92  95  98 112 100 103  99

规律:右下角(高频)数值大,量化后更接近 0 → 高频信息被丢弃

这就是 JPEG 损失的来源。

质量参数(Quality)如何影响?

质量参数(1-100)控制量化表的缩放:

  • Quality = 100:量化表全部除以 1,几乎无损
  • Quality = 75:标准量化表(肉眼无损)
  • Quality = 10:量化表放大 10 倍,严重失真

6. Z 字形扫描

把 8×8 的二维数组按 Z 字形展开成一维:


Z 字形顺序:
(0,0) → (0,1) → (1,0) → (2,0) → (1,1) → (0,2) → (0,3) → ...

目的:把低频系数放在前面,高频系数放在后面,便于后续编码。

7. 熵编码(Huffman / 算术编码)

把扫描后的系数序列做 Huffman 编码或算术编码:

  • 0 出现概率高 → 短编码
  • 大数值出现概率低 → 长编码

最终输出 JPEG 比特流。

解码(逆向过程)

解码是编码的严格逆过程:


JPEG 比特流
  ↓
熵解码
  ↓
Z 字形反扫描
  ↓
反量化(× quantization_table)
  ↓
逆 DCT(IDCT)
  ↓
色度上采样
  ↓
YCbCr → RGB
  ↓
原始图片(近似)

JPEG 的优缺点

优点

  • ✅ 算法成熟,30 年验证
  • ✅ 压缩率高(10:1 到 100:1 可调)
  • ✅ 兼容性好(所有设备支持)
  • ✅ 实现简单,开源实现众多

缺点

  • 有损压缩:每次保存都会损失画质
  • 不支持透明度:JPEG 没有 alpha 通道
  • 块效应:低质量下 8×8 块边界可见
  • 不适合文字/线条:边缘容易模糊

闪压对 JPEG 的优化

闪压在 JPEG 压缩上做了几项优化:

  1. 自适应质量参数:根据图片内容自动选择最佳 Quality
  2. 智能色度下采样:对色度变化大的图片保留更多色度信息
  3. 渐进式编码:默认输出 Progressive JPEG,网页加载更平滑
  4. EXIF 优化:保留关键元数据,去除冗余信息

后继者:JPEG XL、WebP、AVIF

JPEG 标准已发布 30 多年,新一代格式正在挑战它的地位:

格式 同画质体积 兼容性
JPEG 基准 100%
WebP -30% 95%
AVIF -50% 70%
JPEG XL -40% 30%(发展中)

未来 5-10 年,JPEG 仍将是最通用的格式,但 WebP/AVIF 会在 Web 场景逐步取代它。

写在最后

理解 JPEG 算法的意义,不只是为了"懂技术",更在于:

  1. 更好地选择压缩参数:知道 Quality 75 是肉眼无损,就不用盲目选 100
  2. 更好地选择格式:文字/图标用 PNG,照片用 JPEG
  3. 更好地理解工具:知道闪压的"智能模式"在做什么

—— 闪压团队 / 技术部


下一篇将深入讲解 AV1 编码,敬请期待。

标签

技术JPEG压缩算法DCT技术解析闪压技术

喜欢这篇?下载闪压试试

完全免费 · 本地处理 · 无广告

立即下载闪压