照片压缩原理——分辨率、质量、色度抽样与元数据
讲解决定照片体积的五个因素(分辨率、质量与量化、色度抽样、元数据、格式),并说明把图片压缩到 200KB 等指定大小时,按什么顺序调整质量和分辨率画质损失最小。
照片文件的体积,取决于“保存多少个像素、每个像素用几位、附带哪些额外信息”。一张手机照片 3~5MB,而报名系统的上传入口却要求 100~500KB,这种情况很常见;缩小这个差距的方法大致有五种。本文说明每种方法对体积和画质的影响,以及要压缩到指定大小时按什么顺序调整最合适。
1. 分辨率——体积下降最明显的因素
压缩前原始数据的大小是宽度像素 × 高度像素 × 3 字节(RGB)。4032×3024 像素的照片约有 1,219 万像素,原始数据约 36MB。宽、高各缩小一半,像素数就变成四分之一,压缩后的体积也会按大致相同的比例减小。
| 宽×高(px) | 像素数 | 原始数据(RGB) | 用途示例 |
|---|---|---|---|
| 4032×3024 | 约 1,219 万 | 约 36.6MB | 手机原图 |
| 2016×1512 | 约 305 万 | 约 9.1MB | 博客正文高清图 |
| 1080×1350 | 约 146 万 | 约 4.4MB | Instagram 竖版帖子 |
| 413×531 | 约 22 万 | 约 0.66MB | 韩国护照照片(在线申请推荐尺寸) |
如果像报名照片那样规定了像素尺寸,请先缩小到该尺寸,很多时候仅此一步就能满足目标体积。韩国外交部的在线护照照片推荐 413×531 像素、要求 500KB 以下,缩小到这个尺寸的 JPG 通常即使用较高质量也能轻松达标。
2. 质量与量化——JPG、WebP 的“质量”滑块在做什么
JPG 把图像分成 8×8 的块并转换为频率分量,再把每个分量除以量化表中的值后取整。调低质量值,这个除数就会变大,取整后变成 0 的高频分量就更多。连续的 0 越长,后续的熵编码(霍夫曼编码)就能用极短的代码表示,体积随之减小。
- 质量 90 以上:肉眼很难与原图区分,但体积会急剧增大。
- 质量 70~85:对照片来说效率最高的区间,大多数网络图片都在这个范围。
- 质量 50 以下:天空、皮肤开始出现色阶断层,边缘周围出现污迹(振铃),8×8 块的边界也开始显现。
质量值与体积的关系不是直线。质量从 95 降到 85 时体积大幅减小;从 60 降到 50 时体积减小有限,画质受损却更明显。因此,如果需要把质量降到 60 以下,改为缩小分辨率效果更好。
3. 色度抽样——少存一些颜色信息
人眼对亮度变化敏感,对颜色变化则不那么敏感。所以 JPG 和有损 WebP 常把 RGB 转换为亮度(Y)和色差(Cb、Cr),再把色差以宽、高各一半的分辨率保存(4:2:0)。仅此一项,颜色信息就减少到四分之一,整体原始数据减半。
在照片上几乎看不出差别,但在有红色文字、细彩色线条的图像上,文字边缘可能显得发虚。按规范,有损 WebP 始终使用 4:2:0(MDN),所以彩色文字很重要的图形更适合用 PNG 或无损 WebP。
4. 元数据——藏在照片里的几十 KB
手机照片里还带有拍摄设备、时间、GPS 坐标等 EXIF 信息,以及用于预览的小缩略图和色彩配置文件(ICC)。它们通常只有几 KB 到几十 KB,在总体积中占比不大,但当目标很小(例如 100KB 以下)时就不能忽视。更重要的是,位置信息会原封不动地留在文件里。用浏览器的 Canvas 重新编码时,这些信息大多会被去掉。详情请参阅 EXIF 元数据与隐私。
5. 格式选择——用更少的字节达到相同画质
画质相同时,较新的编解码器体积更小。Google 公布,在相同 SSIM 画质下,有损 WebP 比 JPG 小 25~34%,AVIF 通常更小。不过如果提交方只接受 JPG,就无法更换格式,所以这个方法主要用于网页发布。各格式的差异整理在 JPG vs PNG vs WebP vs AVIF 中。
质量值在不同格式、不同软件之间并不通用
“质量 80”并不是标准规定的单位。各编码器把质量值换算成量化强度的方式各不相同,所以同样是 80,JPG、WebP、AVIF 得到的画质和体积都不一样;即便同为 JPG,不同软件也会略有差异。因此,与其死守“必须存成多少”的绝对标准,不如把结果文件放大与原图对比后再决定,这样更准确。批量按相同条件处理时,先拿一张试一试,再应用到其余图片。
渐进式(progressive)JPG
JPG 标准(T.81)除了从上到下一次绘制完成的基线(baseline)方式外,还定义了先显示模糊的全图、再逐步变清晰的渐进式(progressive)方式。在慢速网络下查看大照片时,体感速度会更好。体积差异因照片而异;另外,一些老旧设备和软件无法读取渐进式 JPG,所以用于提交时选基线方式更稳妥。
用实例看调整过程
假设要把手机拍的 4032×3024 照片(约 3~4MB)上传到“宽度 1000 像素以内、200KB 以下”的入口。
- 先把宽度缩小到 1000 像素。高度按比例变为 750 像素,像素数降到原图的约 6%。仅这一步,大多数照片就会降到几百 KB 以下。
- 在此状态下用质量 85 保存,看是否超过 200KB。超过的话,就按 80、75 的顺序降低质量,或用二分查找来找。
- 如果是噪点多的夜景照片,需要把质量降到 60 以下,那就把宽度再缩小到 900 像素,结果会更干净。
压缩到指定大小(KB)的顺序
要满足“请上传 200KB 以下”这类条件时,按下面的顺序画质损失最小。
- 先缩小到需要的像素尺寸。 有规定尺寸就用规定尺寸,没有就用屏幕上的显示尺寸(例如宽 1200~2000px)。
- 用二分查找确定质量。 在质量 50 到 95 之间取中间值保存试试,比目标大就再对下半段二分,比目标小就对上半段二分。7~8 次就能找到不超过目标的最高质量。
- 质量降得太低时,再稍微缩小分辨率。 宽、高各缩小 10%,像素数约减少 19%。然后重复第 2 步。
- 确认 KB 的计算标准。 有的地方把 1KB 当作 1,000 字节,有的当作 1,024 字节。不清楚时按 1,000 字节计算、压得更小一些,两种标准都能通过。
- 区分“小于”和“不超过”。 如果要求“小于 100KB”,正好 100KB 的文件就无法通过。
图片压缩工具会自动完成这个过程。输入目标 KB 后,它会对质量做二分查找,碰到质量下限时再逐步缩小分辨率,在不超过目标的前提下选出最清晰的结果。
常见错误
- 把已压小的文件再存大:把已经用质量 60 保存的 JPG 再用质量 95 保存,只会让体积变大,画质不会恢复。
- 反复多次压缩:每保存一次损失就累积一次。请始终从原图出发,一次做出想要的结果。
- 把截图压成 JPG:文字会糊掉,有时甚至比 PNG 还大。屏幕截图请保持 PNG,或缩小分辨率。
常见问题
用质量 100 保存,就和原图一模一样吗?
JPG 即使在质量 100 时,颜色转换和取整过程中的损失依然存在,所以并不是完全无损。而且在质量 90 以上,肉眼几乎看不出差别,体积却常常大幅增加。
降低分辨率不会让画质变差吗?
超过屏幕显示尺寸的分辨率反正会被缩小显示,所以缩小后体感差别不大。反过来,如果缩得比需要的尺寸还小再放大,就会变模糊,因此请先确认最终用途需要的像素尺寸。
同样的设置,为什么每张照片的体积不一样?
压缩效率很大程度上取决于照片内容。蓝天这种简单的照片会很小,而树叶、沙子、噪点多的夜景等细节丰富的照片会很大。