一张图,怎样少记一些数字?
一块图像可以逐个记录像素,也可以改成“整体有多亮、明暗怎样变化”。本片把一小块图改写成几种基础明暗图案的组合。
变化慢的图案描述大轮廓,变化密的图案描述细节。矩阵中的格子表示这些图案各占多少,并不是原图里同位置的像素。
压缩时,把一些数字记得粗一点,就可能损失细节。 重建画面能让你看到变化。这里比较的是系数和还原图,估计值不是一个真实 JPEG 文件的大小。
如果只能留下一个数,会剩下什么?
- 先只保留最基本的明暗信息,再逐渐加回细节,观察图块变化。
- 保持全部位置可用,把画质调低,比较轮廓和纹理失去什么。
- 换一种图案重复观察:同样的取舍,是否看起来同样明显?只保留少数位置是附加实验,不是常规 JPEG 的全部方法。
很多零,怎样变成更小的文件?
进一步操作与数值核对
把“允许保留的低频位置”降到 1。现在只有左上角的平均亮度分量被保留,图像变成一块均匀颜色。慢慢向上增加,观察轮廓与细节依次出现。这是帮助理解频率的附加实验;常规 JPEG 主要通过量化控制取舍,并不简单地只保留前 N 个位置。
再保持允许位置为 64,把画质参数从高向低拖动。比较三种图案:
渐变往往能用少量低频描述。斜边需要更多频率才能把边界表达清楚,粗量化可能带来边缘附近的波纹。纹理包含更密集的变化,舍去高频后会丢失细碎结构。
右侧的重建图块和下方的均方误差都来自实际计算。试着寻找两个误差接近、但观感不同的结果:数字能比较失真,却不能完整代表人的视觉感受。
想核对技术细节?
看一块缓慢变亮的渐变:用 64 个亮度数记录它,当然没有错。但如果能说清它的整体明暗和变化方向,许多数字就不必那么精细。这就是变换编码要寻找的机会。
实验从一个 8×8 的亮度图块开始。离散余弦变换,也就是 DCT,把它改写为 64 种基础图案的加权组合。左上角的系数表示整体亮度,其余位置描述不同方向、不同密度的明暗变化。
点击频率矩阵,再切换到“看看一种频率”。低频图案的明暗变化缓慢;高频图案的条纹更密。这些格子表示变化方式,不是原图中同位置的像素。
DCT 本身并不必然丢失信息。真正的有损步骤是量化:每个系数除以对应步长后取整。很小的细节系数可能变成零,较大的系数也会变得不够精确。重建时再乘回步长,舍去的小数已经无法恢复。
展开:从频率系数到编码
JPEG 会按约定顺序读取系数,使高频中的连续零更容易集中出现。整体亮度系数可以相对前一个图块做差,其余系数则可以用游程和熵编码等方式表示。图像尺寸、编码表、标记和元数据也需要空间。
所以,非零系数少通常为进一步压缩创造机会,但“少了 20 个系数”不等于“省了 20 字节”。这个实验没有生成完整 JPEG 文件,因此只报告真实算出的系数和重建误差。
展开:彩色图像还会丢掉什么?
常见 JPEG 流程会将颜色转换为亮度与色差信息,并可能降低色度通道的采样分辨率。人眼通常对亮度结构更敏感,这为节省颜色信息提供了空间。不过,细小彩色文字等内容可能明显受影响。
这里使用单个灰度图块来隔离 DCT 与量化的效果。没有模拟相邻图块接缝、完整色彩转换和色度降采样,也不能从一个图块推断整张照片的最终文件大小。
当你再次调整“画质”时,可以想象自己正在改变一个取舍:保留哪些变化,允许哪些细节变得不那么精确。