技术
深入理解 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 压缩上做了几项优化:
- 自适应质量参数:根据图片内容自动选择最佳 Quality
- 智能色度下采样:对色度变化大的图片保留更多色度信息
- 渐进式编码:默认输出 Progressive JPEG,网页加载更平滑
- 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 算法的意义,不只是为了"懂技术",更在于:
- 更好地选择压缩参数:知道 Quality 75 是肉眼无损,就不用盲目选 100
- 更好地选择格式:文字/图标用 PNG,照片用 JPEG
- 更好地理解工具:知道闪压的"智能模式"在做什么
—— 闪压团队 / 技术部
下一篇将深入讲解 AV1 编码,敬请期待。