图片压缩入门:有损与无损到底差在哪
压缩的本质:把冗余信息去掉
一张 4000×3000 的 24 位真彩色照片,按每像素 3 字节计算,原始数据接近 36MB。所谓压缩,就是在保留看起来一样的前提下,把这些字节重新编码,去掉其中的冗余。冗余分两类:一类是数据本身的重复,比如大片纯色区域里相邻像素完全相同;另一类是人眼感知不到的信息,比如亮度接近的细微色差、超出显示能力的高频细节。前一类可以用无损方式完整还原,后一类只能有损地丢弃。
理解这条分界线,就理解了最常见的两个困惑:为什么 PNG 压不动照片,为什么 JPEG 反复保存会越来越糊。
有损压缩:DCT 与量化
JPEG 是理解有损压缩最好的样本。它的处理流程大致是分块、颜色空间变换、离散余弦变换、量化、熵编码。其中真正造成信息损失的只有一步,量化。
离散余弦变换
JPEG 把图像切成 8×8 的像素块,对每块做离散余弦变换。DCT 的作用是把空间上的像素明暗分布转换成频率上的变化剧烈程度:低频分量描述整体亮度趋势,高频分量描述边缘和纹理。变换本身是可逆的,不丢信息,但它让后续处理变得容易,因为人眼对低频敏感、对高频迟钝,可以对不同频率区别对待。
量化:体积与画质的真正开关
量化是把 DCT 系数除以一张量化表再取整。量化表里高频位置的分母更大,取整后大量高频系数直接变成 0。这些 0 在熵编码阶段几乎不占空间,体积就这样降下来了。质量滑杆控制的其实就是量化表的缩放倍数:质量 90 时表很细,保留大量高频;质量 50 时表很粗,纹理和细节被抹平,同时出现方块状伪影。
压缩率的增长不是线性的。质量从 100 降到 90 往往能省下相当可观的体积,而从 50 降到 40 的收益小得多,画质下滑却依然明显。这也解释了为什么按指定体积压缩很难一次命中。
色度二次采样
JPEG 在变换前会把 RGB 转换成 YCbCr:Y 是亮度,Cb、Cr 是色度。人眼对亮度分辨率的要求远高于色度分辨率,所以常见做法是保留全部亮度信息,色度在水平和垂直方向各减半采样,这就是 4:2:0。它能在几乎不被察觉的情况下再省掉可观体积,代价是红蓝边缘容易出现串色,这也是为什么带细红字或彩色线条的图片用 JPEG 会出现脏边。
无损压缩:RLE 与预测编码
无损压缩不丢任何信息,靠的是把数据描述得更紧凑。
- 游程编码(RLE):把连续重复的值记成值和重复次数。一片纯白区域原本要写几百个相同字节,编码后只剩两个数。它对图标、截图、纯色背景极其有效,对照片几乎无效,因为照片的相邻像素很少完全相同。
- 预测编码:用已经编码的相邻像素预测当前像素,只记录预测误差。自然图像相邻像素高度相关,误差集中在 0 附近,分布很窄,熵编码后占用极少空间。PNG 的行滤波、GIF 的部分处理都属于这一类思路。
- 字典压缩:把反复出现的字节序列登记成短代号。DEFLATE 就是字典压缩与霍夫曼编码的组合,PNG 的 zlib 数据流用的正是它。
无损压缩的比率有天花板。自然照片一般只能压到原体积的六七成,再怎么优化也无法和 JPEG 相比;而矢量图形、界面截图、文字截图常常能压到原来的三分之一甚至更小。
为什么 JPEG 适合照片,PNG 适合图标截图
判断标准其实只有一条:图里有没有大量高频且不重复的内容。
照片是连续色调的,相邻像素缓慢变化,允许丢掉一部分高频细节而不影响观感,这正是 JPEG 的强项。图标、logo、界面截图、带文字的图表则相反,它们由大片纯色和锐利边界组成。无损压缩能高效吃掉大片纯色,但有损压缩会在锐利边界两侧生成振铃和色斑:原本干净的直线变成毛边,黑色文字周围浮出灰晕。这种劣化比照片稍微糊一点更刺眼。
| 图片内容 | 推荐格式 | 原因 |
|---|---|---|
| 摄影照片、人物、风景 | JPEG 或有损 WebP | 连续色调,高频细节可丢弃 |
| 带透明背景的图形 | PNG 或 WebP | 需要 alpha 通道 |
| 图标、logo、界面截图 | PNG 或无损 WebP | 纯色多、边界锐利,有损易生伪影 |
| 含大段文字的截图 | PNG | 文字边缘对压缩伪影极其敏感 |
| 多帧简单动画 | GIF、WebP 或 AVIF | 需要保留帧序列 |
按用途选择压缩策略
同一个压缩目标,在不同场景下的正确答案完全不同。可执行的建议如下。
归档保存:优先保留原始文件,不要用有损格式覆盖唯一副本。如果必须压缩,JPEG 用质量 90 到 95 并关闭色度二次采样,PNG 使用无损模式,宁可多占空间也要保住细节。
邮件附件:多数邮箱对单封邮件有 20 到 25MB 的总体积限制。一张高像素照片在质量 80 下通常在 2 到 4MB,附上五张就接近上限。更稳妥的做法是先把长边缩到 1600 到 2000 像素,再用质量 78 到 82 编码,单张通常能控制在 500KB 以内。
网页展示:目标是让首屏尽快出现。正文配图长边 1200 到 1600 像素、质量 75 到 82 已经足够;列表缩略图长边 400 到 600 像素、质量 70 到 75。格式上优先 WebP,需要兼容旧环境时再退回 JPEG。
打印输出:不要为了体积牺牲分辨率。印刷通常需要约 300 DPI,A4 满幅对应约 3508×2480 像素。这个尺寸下 JPEG 质量从 90 起步,宁可接受十几 MB 的文件,也不要让压缩伪影出现在成品上。
网页场景参数速查
- 横幅大图:长边 1920 像素,质量 80,WebP,目标 200 到 400KB
- 文章配图:长边 1440 像素,质量 80,WebP,目标 150 到 250KB
- 卡片缩略图:长边 600 像素,质量 72,WebP,目标 40 到 80KB
- 头像:256×256 像素,质量 80,目标 20KB 以内
需要批处理时,可以用 图片压缩工具 或 图片压缩工具 依次过一遍,全部在浏览器本地完成,不必担心图片被上传到服务器。
参数落到工具上怎么理解
在 在线图片压缩 的流程里,有几个细节直接对应上面的原理。
- JPEG 与 WebP 用质量滑杆,范围 1 到 100,默认 80。工具会读取原图的量化表估算它原本的质量,如果原图已经低于 80,就不会继续降质,避免对已经压缩过的图片做二次伤害。
- PNG 用颜色数滑杆,范围 2 到 256,另有独立的无损模式。PNG 本身是无损格式,调整质量没有意义,能做的只有减少颜色数量,把 24 位真彩降到 8 位调色板。
- GIF 同样用颜色数滑杆,压缩时会保留动画帧与每帧的延时。
- SVG 用坐标精度控制,本质是减少路径上小数点的位数。
完整的操作步骤可以看 图片压缩完整教程。如果目标不是尽量小,而是必须小于某个数值,思路要换一套,见 把图片压缩到指定大小。
三个常见误区
反复保存 JPEG。每次保存都会再做一次 DCT 量化和取整,损失是累积的。一张质量 85 的图片再存三次质量 85,实际画质明显低于一次存成质量 85。要编辑就先保存为无损格式,最后一步再导出 JPEG。
以为质量调到 100 就是无损。质量 100 只是量化表最细,色度二次采样和系数取整依然存在。真正需要无损请用 PNG 或无损 WebP。
只调质量不动分辨率。对于网页用途,把 4000 像素宽的图缩到 1600 像素,往往比把质量从 90 降到 70 更有效,而且观感损失更小。先定尺寸,再定质量,顺序反了就会白费力气。
判断顺序可以固定为三步:先由用途决定目标尺寸,再由内容决定格式,最后用质量或颜色数微调到目标体积。
想直接动手试?打开 在线图片压缩 - 免费压缩 JPEG、PNG、WebP ,把图片拖进去即可,全程在浏览器本地处理。