打开手机相册,随便找一张照片看看它的文件大小——可能2MB、3MB,甚至更大。但你有没有想过,如果相机传感器拍下来的原始数据不做任何处理,一张2000万像素的照片要占多大地方?答案是大约60MB。几十兆的照片被压缩成几兆,信息少了九成以上,但你看上去几乎察觉不到差别。是谁做了这个手脚?
答案是JPEG——这个1992年诞生的图像格式标准,至今仍是互联网上照片的绝对主力。它的核心思想反直觉:压缩不是保存信息,而是有选择地丢弃信息。
人眼才是真正的设计师
JPEG的设计者发现了一个关键事实:人眼对亮度的变化比对颜色的变化敏感得多。你把一张彩色照片转成灰度图,细节依然清晰;但如果你把亮度信息去掉只保留颜色,画面立刻变成一团模糊。这被称为视觉系统的亮度优先特性。
JPEG利用这个特性做了两件事。第一,把图像的亮度和颜色信息分开存储——Y代表亮度,Cb和Cr代表颜色。第二,对颜色信息下手更狠:它把画面切成8x8像素的小块,然后把每个小块里那些人眼不太注意的高频颜色细节直接扔掉。这个过程叫做色度子采样,是JPEG第一个丢信息的地方。
从像素到频率的魔法
接下来是最巧妙的一步:离散余弦变换,简称DCT。
你可以把一张8x8的小图块想象成一块起伏不平的地面。DCT就像一个神奇的算法,它不直接记录每个像素的值,而是问你:这块地面整体有多高?从左到右的坡度有多大?从上到下的起伏有多剧烈?有没有那种忽高忽低的小毛刺?
这些问题对应着不同频率的余弦波。DCT把一块图像分解成64个频率分量,每个分量有一个系数。低频分量对应图像的大致轮廓(天空、墙壁等大面积区域),高频分量对应图像的细节(头发丝、树叶边缘等)。最关键的是,高频分量的系数往往非常小。
量化:大屠杀开始了
DCT本身不丢信息,它只是换了种方式描述图像。真正让文件缩小的步骤是量化。
量化就是把DCT系数除以一个数字然后取整。除以2,有效信息少1位;除以16,少4位。对低频分量用小的除数(少丢),对高频分量用大的除数(多丢)。结果就是:那些你不注意的微小细节,系数变成了0。JPEG甚至专门有一张量化表,是经过大量视觉实验调出来的——这张表定义了什么地方可以糊弄人眼。
量化之后,原来8x8的矩阵里会出现大量连续的0。这时候轮到最后的压缩步骤上场:用游程编码和霍夫曼编码把这些连续的0用一个简短记号代替。这就像数学里把000000写成6个0,节省了大量空间。
有损和无损的根本区别
JPEG是有损压缩——压缩后的数据无法100%还原原始图像。你问它为什么不能还原,答案是:量化那一步已经把数值四舍五入了,丢掉的精度再也找不回来。
相对的,PNG是无损压缩。它不丢任何像素信息,而是用一种叫DEFLATE的算法找到数据的重复模式来节省空间。PNG适合文字截图、图标、线条图——这些图像包含大量锐利边缘和精确颜色,丢掉任何信息都会立即被看出来。而照片的颜色和亮度是渐变的,丢一点细节人眼根本发现不了。
所以选格式是有学问的:照片用JPEG,截图用PNG。有人说JPEG画质差,实际上是因为压缩率设得太高——量化表下手太重。现代JPEG编码器在90%以上的质量下,几乎看不出与原图的区别,但文件只有原图的十分之一。
现代压缩技术走得更远
JPEG的继承人已经在路上。HEIF格式使用更高效的多频率变换,同等画质下比JPEG小一半。Google的WebP和新兴的AVIF也在争夺下一代图像标准的位置。但无论它们怎么进化,核心逻辑和JPEG一模一样:找出人眼不关心的信息,然后毫不犹豫地丢掉。
每一张你收藏在手机里的照片,背后都有一个看不见的裁缝在说:这里太啰嗦了,剪掉。那里颜色太碎了,糊一下。反正他看不出来。这个裁缝的手艺,就是一百多年来人类对自身视觉系统理解的全部精华。