一张未经压缩的24位真彩色照片,每像素需要3字节存储。以1200万像素的数码照片为例,原始数据量约为36MB。然而保存为JPEG格式后,这个数字往往能降到3MB左右,压缩比达到10:1甚至更高,而人眼几乎察觉不到画质损失。这种看似不可思议的数据压缩是如何实现的?答案藏在人类视觉系统的生理特性与一种诞生于三十五年前的数学变换之中。

从国际电话线到数字图像标准

1986年,国际电信联盟(ITU)与国际标准化组织(ISO)共同组建了一个名为联合图像专家组的委员会。当时的背景是:数字图像存储与传输需求急剧增长,但存储介质价格昂贵,网络带宽更是稀缺资源。人们迫切需要一种能够有效压缩连续色调静止图像的标准。

六年后的1992年9月18日,JPEG-1标准正式获得批准,成为ITU-T T.81和ISO/IEC 10918-1两份等价的国际标准。这个标准定义了一套完整的压缩框架,包括有损压缩、无损压缩、顺序编码、渐进编码和层次编码等多种工作模式。其中,基于离散余弦变换(DCT)的有损压缩模式成为了应用最广泛的方案,以至于今天人们提到JPEG时,几乎都是指这一特定模式。

timeline
    title JPEG发展时间线
    1986 : JPEG委员会成立
    1992 : JPEG-1标准发布<br/>(ITU-T T.81/ISO 10918)
    2000 : JPEG 2000发布<br/>(小波变换)
    2009 : JPEG XR发布<br/>(微软HD Photo)
    2018 : JPEG XS发布<br/>(广播级低延迟)
    2019 : JPEG获艾美奖
    2020 : JPEG XL发布<br/>(下一代标准)

2019年,JPEG委员会因其贡献获得了黄金时段工程艾美奖。一个图像压缩标准能够获得电视界的最高荣誉,本身就说明了它在媒体产业中的核心地位。据统计,截至2017年,全球每天产生的JPEG图像数量高达数十亿张,从社交媒体到医疗影像,从卫星遥感到家庭相册,这项三十多年前的技术依然统治着数字图像世界。

人眼的盲区:色度子采样

JPEG压缩的第一步不是数学变换,而是对人类视觉生理特性的利用。人眼视网膜上有两种感光细胞:负责明暗感知的视杆细胞和负责色彩感知的视锥细胞。视杆细胞的数量约为视锥细胞的20倍,这意味着人眼对亮度变化的敏感度远高于色彩变化。

JPEG利用这一特性,首先将图像从RGB色彩空间转换到YCbCr色彩空间。Y代表亮度(Luminance),Cb和Cr分别代表蓝色和红色的色度分量(Chrominance)。转换公式如下:

$$Y = 0.299R + 0.587G + 0.114B$$$$Cb = -0.1687R - 0.3313G + 0.5B + 128$$$$Cr = 0.5R - 0.4187G - 0.0813B + 128$$

转换完成后,对色度分量进行子采样。最常见的4:2:0子采样模式将色度分量在水平和垂直方向各缩小一半——原本每4个像素共享4个亮度值,但只保留1个蓝色色度值和1个红色色度值。这意味着色度数据量直接压缩到了原来的四分之一,而人眼几乎无法察觉这种变化。

graph LR
    A[原始RGB图像] --> B[色彩空间转换]
    B --> C[YCbCr图像]
    C --> D[色度子采样 4:2:0]
    D --> E[Y全分辨率<br/>Cb/Cr四分之一分辨率]
    E --> F[数据量减少约50%]

这一步是无损的——如果保留色度的原始分辨率(即4:4:4采样),图像完全可以精确重建。但绝大多数JPEG图像都采用4:2:0子采样,因为它以极小的感知代价换取了可观的数据压缩。

八乘八的秘密:分块与电平偏移

完成色彩空间转换和子采样后,JPEG将每个分量划分为8×8像素的小块。为什么是8×8而不是4×4或16×16?这个尺寸的选择是压缩效率与块效应之间的权衡。块太小,频域变换无法有效利用像素间的相关性;块太大,则难以适应图像的局部变化,且计算复杂度显著增加。

在分块之前,还需要进行电平偏移操作:将每个8位像素值从[0, 255]范围偏移到[-128, 127]。这步看似简单,却至关重要——它使像素值以零为中心对称分布,有利于后续DCT变换的低频系数集中。

graph TB
    subgraph 分块处理
        A[完整图像] --> B[划分8×8块]
        B --> C[块1]
        B --> D[块2]
        B --> E[块N]
    end
    C --> F[电平偏移<br/>减去128]
    F --> G[准备DCT变换]

这种分块处理决定了JPEG的一个根本性局限:块之间的像素被独立处理,当压缩比较高时,块边界处的不连续性就会变得可见,形成所谓的"块效应"。

从空间到频率:离散余弦变换

离散余弦变换是JPEG压缩的核心。DCT将图像块从空间域(像素值)转换到频率域(频率系数),使我们能够区分图像中的低频和高频成分。

二维DCT的数学定义如下:

$$F(u,v) = \frac{1}{4}C(u)C(v)\sum_{x=0}^{7}\sum_{y=0}^{7}f(x,y)\cos\frac{(2x+1)u\pi}{16}\cos\frac{(2y+1)v\pi}{16}$$

其中,$f(x,y)$是空间域的像素值,$F(u,v)$是频率域的系数,$C(u)$和$C(v)$是归一化因子:

$$C(k) = \begin{cases}\frac{1}{\sqrt{2}} & k=0 \\ 1 & k\neq 0\end{cases}$$

这个公式看起来复杂,但其物理意义非常直观:任何一个8×8的图像块都可以被分解为64个"基础图案"的加权和。这64个基础图案对应不同的空间频率——左上角是直流分量(整个块的平均亮度),向右和向下分别是水平和垂直方向的低频到高频。

graph LR
    subgraph 频率系数排列
        A["DC<br/>F(0,0)"] --> B["低频<br/>AC系数"]
        B --> C["中频<br/>AC系数"]
        C --> D["高频<br/>AC系数"]
    end
    style A fill:#f9f,stroke:#333
    style D fill:#fff,stroke:#333

DCT变换本身是可逆的,理论上不损失任何信息。但它的价值在于:自然图像的能量高度集中在低频系数上。典型情况下,一个8×8图像块经过DCT变换后,大部分高频系数的值都接近于零,而主要的视觉信息被压缩到少数几个低频系数中。这正是JPEG压缩能够奏效的根本原因。

量化:在数学与感知之间做出选择

量化是JPEG压缩中唯一真正"损失"信息的步骤。每个DCT系数被除以量化矩阵中对应的值,然后四舍五入到整数:

$$F_q(u,v) = \text{round}\left(\frac{F(u,v)}{Q(u,v)}\right)$$

量化矩阵的设计直接决定了压缩比和图像质量之间的权衡。JPEG标准给出了两组推荐的量化矩阵,分别用于亮度和色度分量:

亮度量化矩阵(示例):

$$ Q_Y = \begin{bmatrix} 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 \end{bmatrix} $$

观察这个矩阵可以发现一个规律:数值从左上角向右下角递增。左上角对应低频系数,使用较小的量化步长(16、11、10等),保留较多细节;右下角对应高频系数,使用较大的量化步长(99、101等),大量信息被归零。

这种设计基于人眼视觉系统对不同空间频率的敏感度差异。人眼对低频变化(如大面积的颜色过渡)高度敏感,而对高频变化(如精细纹理和边缘)的感知能力较弱。量化矩阵正是利用这一特性,在感知损失最小化的前提下实现最大压缩。

实际应用中,软件通过一个"质量因子"(Quality Factor,通常取值1-100)来调整量化矩阵。质量因子100时,所有量化值都取1,相当于仅进行DCT变换而不损失信息;质量因子降低时,量化值按比例放大,更多高频系数被归零,压缩比提高但画质下降。

graph TD
    A[DCT系数矩阵] --> B[除以量化矩阵]
    B --> C[四舍五入]
    C --> D{系数是否为零?}
    D -->|是| E[存储0]
    D -->|否| F[存储量化值]
    E --> G[大量高频系数归零<br/>实现压缩]
    F --> G

Z字形扫描:从二维到一维的桥梁

量化后的DCT系数是一个二维矩阵,但熵编码需要处理一维数据流。Z字形扫描(Zigzag Scan)的任务就是将8×8矩阵转换为一维序列,同时保证重要系数优先出现。

扫描顺序从直流系数(DC)开始,然后沿对角线方向依次扫描低频、中频和高频系数。这种顺序设计使得大量为零的高频系数集中在序列末尾,为后续的游程编码创造了理想条件。

graph TD
    subgraph Z字形扫描顺序
        A0["0"] --> A1["1"]
        A1 --> A2["5"]
        A2 --> A3["6"]
        A3 --> A4["14"]
        A4 --> A5["15"]
        A5 --> A6["27"]
        A6 --> A7["28"]
    end
    style A0 fill:#f96,stroke:#333

完整的Z字形扫描顺序如下:

$$ \begin{bmatrix} 0 & 1 & 5 & 6 & 14 & 15 & 27 & 28 \\ 2 & 4 & 7 & 13 & 16 & 26 & 29 & 42 \\ 3 & 8 & 12 & 17 & 25 & 30 & 41 & 43 \\ 9 & 11 & 18 & 24 & 31 & 40 & 44 & 53 \\ 10 & 19 & 23 & 32 & 39 & 45 & 52 & 54 \\ 20 & 22 & 33 & 38 & 46 & 51 & 55 & 60 \\ 21 & 34 & 37 & 47 & 50 & 56 & 59 & 61 \\ 35 & 36 & 48 & 49 & 57 & 58 & 62 & 63 \end{bmatrix} $$

经过量化后,大量高频系数已经变为零。Z字形扫描后,一维序列往往呈现这样的模式:前面是非零系数,后面是一长串零。这正是熵编码高效工作的前提。

熵编码:最后的压缩冲刺

JPEG使用霍夫曼编码作为标准的熵编码方法(算术编码是可选的替代方案)。编码分为两部分处理:直流系数(DC)和交流系数(AC)。

直流系数编码:由于相邻图像块的亮度通常相近,相邻块的DC系数差异较小。JPEG对DC系数采用差分编码,只编码当前块DC系数与前一块DC系数的差值。差值通常很小,可以用较短的编码表示。

交流系数编码:AC系数采用游程编码(RLE)与霍夫曼编码的组合。游程编码记录连续零的个数和下一个非零系数的值,形成一个(游程长度,系数值)对。这些符号再用霍夫曼表进行变长编码——出现频率高的符号用短码,出现频率低的符号用长码。

霍夫曼编码的平均码长接近信源的信息熵,理论上已经接近无损压缩的极限。经过这一步,量化后的数据被进一步压缩,最终写入JPEG文件。

flowchart TB
    A[量化后的DCT系数] --> B[Z字形扫描]
    B --> C[一维系数序列]
    C --> D{DC系数}
    C --> E{AC系数}
    D --> F[差分编码]
    F --> G[霍夫曼编码]
    E --> H[游程编码]
    H --> I[霍夫曼编码]
    G --> J[比特流输出]
    I --> J

JPEG文件结构:标记与段的组织

一个JPEG文件由一系列标记和段组成。每个标记以0xFF开头,后跟一个标记码,标识接下来的数据类型和结构。

主要的JPEG标记包括:

标记 名称 功能
0xFFD8 SOI 图像开始
0xFFE0 APP0 JFIF应用段,包含版本、分辨率等信息
0xFFE1 APP1 Exif应用段,包含相机元数据
0xFFDB DQT 定义量化表
0xFFC0 SOF0 帧开始(基线DCT)
0xFFC4 DHT 定义霍夫曼表
0xFFDA SOS 扫描开始
0xFFD9 EOI 图像结束

文件结构大致如下:SOI标记开始文件,APP0或APP1段存储元数据,DQT段定义量化表,SOF0段描述图像尺寸和分量信息,DHT段定义霍夫曼表,SOS段后是实际的压缩数据,最后以EOI标记结束。

这种结构设计使JPEG文件具有良好的可扩展性——新的应用段可以在不破坏兼容性的前提下添加新的元数据,这也是Exif信息能够嵌入JPEG文件的原因。

flowchart LR
    subgraph JPEG文件结构
        A[SOI<br/>0xFFD8] --> B[APP0/APP1<br/>元数据]
        B --> C[DQT<br/>量化表]
        C --> D[SOF0<br/>帧信息]
        D --> E[DHT<br/>霍夫曼表]
        E --> F[SOS<br/>扫描开始]
        F --> G[压缩数据]
        G --> H[EOI<br/>0xFFD9]
    end
    style A fill:#f96,stroke:#333
    style H fill:#f96,stroke:#333

压缩的代价:三种主要失真

有损压缩的代价是图像质量的损失。JPEG压缩主要引入三种类型的失真:块效应、振铃效应和蚊式噪声。

块效应(Blocking Artifacts):由于每个8×8块独立处理,高压缩比下块边界处会出现明显的亮度或颜色不连续。这是JPEG最显著的特征性失真,在人眼看来像是图像上覆盖了一层网格。块效应的严重程度与量化矩阵的设计直接相关——量化步长越大,块效应越明显。

振铃效应(Ringing Artifacts):当图像包含锐利的边缘时,高频分量的丢失会导致边缘周围出现"涟漪"状的振荡。这与吉布斯现象本质相同——用有限数量的频率分量重建一个包含陡峭边缘的信号,必然会产生过冲和下冲。在视觉上,振铃效应表现为边缘周围的"光晕"。

蚊式噪声(Mosquito Noise):这是一种类似蚊子飞舞图案的噪点,通常出现在锐利边缘附近或纹理丰富的区域。它源于量化误差在边缘区域的表现——当高频系数被过度量化时,本应平滑的区域会出现随机噪点。

这三种失真在不同压缩比下的表现不同。中等压缩比(质量因子70-85)下,失真通常难以察觉;高压缩比(质量因子低于50)下,所有三种失真都会变得明显,尤其是块效应。

基线与渐进:两种编码策略

JPEG标准定义了两种主要的编码方式:基线JPEG和渐进式JPEG。它们使用相同的压缩技术,但数据的组织方式不同。

**基线JPEG(Baseline JPEG)**采用顺序编码:图像从上到下、从左到右依次编码。解码时,图像也按照同样的顺序逐渐显示——先显示顶部,然后是中间,最后是底部。这是最常见的JPEG编码方式,文件结构简单,解码速度快。

**渐进式JPEG(Progressive JPEG)**采用多遍扫描编码:第一遍扫描只编码低频信息,后续扫描逐步补充高频细节。解码时,图像首先以模糊的形式完整显示,然后逐渐变清晰。渐进式JPEG通过两种机制实现:

  1. 频谱选择(Spectral Selection):将DCT系数按频率分组,第一遍扫描DC和低频AC系数,后续扫描逐步添加高频系数。

  2. 逐次逼近(Successive Approximation):对每个系数的比特位分遍发送,先发送高位,后发送低位。

flowchart TB
    subgraph 基线JPEG
        A1[扫描1] --> A2[完整图像<br/>从上到下显示]
    end
    subgraph 渐进式JPEG
        B1[扫描1: 低频] --> B2[模糊全图]
        B2 --> B3[扫描2: 中频]
        B3 --> B4[较清晰]
        B4 --> B5[扫描3: 高频]
        B5 --> B6[完整清晰图像]
    end

渐进式JPEG的文件体积通常比基线JPEG略小(约2-10%),因为在多遍扫描中可以更好地优化霍夫曼表。更重要的是,在网络传输中,渐进式JPEG让用户更快看到图像的大致内容,改善感知体验。这也是为什么大多数现代网站推荐使用渐进式JPEG的原因。

从JPEG到JPEG XL:标准的三十五年演进

JPEG的成功催生了多个后续标准,但令人意外的是,三十多年来JPEG-1仍然是最广泛使用的图像格式。

JPEG 2000(2000年发布)引入了小波变换替代DCT,提供了更好的压缩效率和渐进解码能力。小波变换将图像分解为不同尺度的子带,避免了块效应,支持感兴趣区域编码。但JPEG 2000的编解码复杂度远高于JPEG,且缺乏浏览器的原生支持,始终未能取代JPEG的地位。

JPEG XR(2009年发布,原名HD Photo)由微软开发,支持更高的动态范围和更宽的色域,采用重叠双正交变换。它试图填补JPEG和JPEG 2000之间的空白,但同样未能获得广泛采用。

JPEG XS(2018年发布)针对专业视频和广播应用,设计目标是"视觉无损"的轻量级压缩。它强调极低的延迟和多次编解码后的质量保持,适用于实时视频传输场景。

JPEG XL(2020年发布)是目前最有希望取代JPEG的标准。它基于Google的PIK提案和Cloudinary的FUIF提案,设计目标是同时实现高压缩效率和向后兼容。JPEG XL在相同质量下通常能比JPEG节省20-50%的文件大小,同时支持更宽的色域和更高的动态范围。JPEG XL还提供了一个独特的功能:可以将现有JPEG文件无损转换为JPEG XL格式,然后再无损转换回JPEG。

然而,JPEG XL面临着一个鸡生蛋的问题:没有浏览器支持就没人使用,没人使用浏览器就没有动力支持。截至2026年,主流浏览器对JPEG XL的支持仍然有限。

技术对比:JPEG与其他格式

理解JPEG的定位需要与其他图像格式进行对比。

特性 JPEG PNG WebP JPEG XL
压缩类型 有损 无损 有损/无损 有损/无损
典型压缩比 10:1 2-3:1 比JPEG高25-34% 比JPEG高20-50%
透明度支持
动画支持
浏览器支持 100% 100% ~97% 有限
编解码复杂度 中-高

PNG采用无损压缩,使用DEFLATE算法,适合存储线条图、文字和需要精确像素的场景。对于照片类图像,PNG的压缩效率远低于JPEG。

WebP由Google开发,基于VP8视频编解码器。它在2010年发布,近年来获得了广泛支持。WebP的有损压缩在相同质量下通常比JPEG文件小25-34%,同时支持透明度和动画。WebP的缺点是编解码复杂度较高,某些细节区域的处理不如JPEG自然。

graph TD
    A["照片类图像"] --> B{需要透明度?}
    B -->|否| C{兼容性优先?}
    B -->|是| D[WebP/PNG]
    C -->|是| E[JPEG<br/>100%兼容]
    C -->|否| F{压缩效率优先?}
    F -->|是| G[WebP/JPEG XL]
    F -->|否| E

JPEG XL代表了图像压缩的前沿水平,但其普及仍然面临生态系统的挑战。对于普通用户而言,JPEG在压缩效率、兼容性和复杂度之间取得了几乎完美的平衡——这或许就是它三十五年屹立不倒的根本原因。

结语

JPEG压缩算法的设计体现了工程学的精髓:没有完美的解决方案,只有在特定约束下的最优权衡。从人眼视觉系统的生理特性出发,JPEG巧妙地利用了色度子采样、频域变换、感知量化等一系列技术,在不显著牺牲主观画质的前提下实现了高效压缩。

三十五年来,虽然多项新技术试图取代JPEG,但这个诞生于上世纪90年代初的标准依然统治着数字图像世界。这不仅仅是技术惯性的结果——JPEG在设计时所做的权衡选择,至今仍然是处理照片类图像的最佳方案之一。当我们理解了DCT变换如何将空间信息转换为频率分量,量化矩阵如何利用人眼的频率敏感度差异,熵编码如何逼近信息熵的极限,就会对这个看似简单的图像格式产生由衷的敬意。它不完美,但足够好——这或许就是工程学的最高境界。


参考文献

  1. ISO/IEC 10918-1 | ITU-T Recommendation T.81. Digital compression and coding of continuous-tone still images: Requirements and guidelines. International Organization for Standardization, 1994.

  2. Wallace, G. K. The JPEG still picture compression standard. Communications of the ACM, 34(4), 30-44, 1991.

  3. Ahmed, N., Natarajan, T., & Rao, K. R. Discrete cosine transform. IEEE Transactions on Computers, 100(1), 90-93, 1974.

  4. Pennebaker, W. B., & Mitchell, J. L. JPEG: Still image data compression standard. Springer Science & Business Media, 1992.

  5. Watson, A. B. DCT quantization matrices visually optimized for individual images. In Human Vision, Visual Processing, and Digital Display IV (Vol. 1913, pp. 202-216). SPIE, 1993.

  6. Hudson, G., Léger, A., Niss, B., & Ubiquitous, J. JPEG-1 standard 25 years: past, present, and future reasons for a success. Journal of Electronic Imaging, 27(4), 040901, 2018.

  7. ITU. How JPEG, released in 1992, gained Emmy fame in 2019. ITU News, 2020.

  8. Wong, K. T., & Konrad, T. Comparison of the DCT JPEG and wavelet image compression encoder for medical images. Journal of Natural Science, Biology and Medicine, 3(1), 17-24, 2012.

  9. Charrier, M., DeFrance, L., & Perrier, P. The JPEG-XS coding standard: A high-quality low-latency lightweight codec for video and image compression. SMPTE Motion Imaging Journal, 128(7), 44-50, 2019.

  10. Alakuijala, J., et al. JPEG XL next-generation image compression architecture and coding tools. In Applications of Digital Image Processing XLIII (Vol. 11510, pp. 44-58). SPIE, 2020.