同一张 1920×1080 的照片,PNG 可能要 2 MB,JPEG 300 KB,WebP 200 KB。三个数字背后不是「谁的技术更先进」,而是三种完全不同的省钱逻辑:一个省的是出错的可能,一个省的是你看不见的高频,一个省的是上一代格式的架构债。
PNG 省的是「错一次的机会」
PNG 是无损格式,解码结果与原图逐比特相同,它靠两招缩小体积:先对每行像素做滤波预测(从左边、上边或左上斜向猜一个值,只记录猜错的残差),再对残差跑 deflate 压缩(LZ77 加哈夫曼编码)。照片的渐变和噪声猜不出规律,残差依旧杂乱,所以 2 MB 起步;而界面截图、图标、线条画大面积同色,滤波之后整行整行地归零,压缩率惊人——一张纯色块为主的 500 KB 截图,往往能无损压到 80 KB 以内。选 PNG 的理由只有一个:一个像素都不许错,比如带文字的长截图、需要反复保存编辑的中间稿。
JPEG 省的是「人眼看不见的高频」
JPEG 的路线是主动丢信息。第一步就把 RGB 转成亮度 Y 加色度 UV,并对色度做 4:2:0 子采样——每 2×2 像素块只留一个 U 和一个 V,色度采样值降到全分辨率的四分之一,全图数据先省一半,而人眼对颜色细节远不如对明暗敏感,几乎无感。第二步把画面切成 8×8 小块做离散余弦变换,把像素换成频率系数,再按质量表量化:高频系数(锐边、细纹理)被大除数狠砍,只保低频。质量 75 的默认档能把 3 MB 原片压到 300 KB 左右,代价藏在暗部色带、锐边振铃和放大后可辨的马赛克块里。
WebP 省的是 JPEG 的架构债
WebP 的有损模式借用 VP8 视频编码的帧内预测:16×16 宏块先根据邻块猜再存残差,配布尔算术编码替代哈夫曼,谷歌公布的口径是同感知质量下比 JPEG 小 25% 到 34%——JPEG 300 KB 的图,WebP 大约 200 KB。它还顺手补了 JPEG 的结构短板:支持完整透明通道(JPEG 要么完全不透明,没有这个概念),支持动图;无损模式对 PNG 的平均优势约 26%。代价是编码更慢,以及十多年前旧浏览器不认,如今兼容率已在 95% 以上,这条历史包袱基本解除。
透明、动画、量化:三张明码实价的小账
透明图在 2020 年前是两难:要透明只能 PNG,照片质感加透明体积爆炸;WebP 出现后才有第三条路。量化是 PNG 世界自己的半无损开关——把颜色数压进 256 色调色板,pngquant 一类工具对截图常能再省六七成,照片档则容易出色带,得配合抖动。动图最烧带宽:一段 GIF 因为只带全局 256 色又无帧间压缩,同样内容换成动画 WebP 普遍能瘦去九成以上。这些开关说明体积并不只由格式决定,参数与内容匹配度同样关键。
按内容查表,别按信仰站队
决策树很短:照片且不要求透明,JPEG 质量 75 起步,还嫌大就换 WebP;线稿、截图、必须无损,PNG,配合 256 色量化;要透明又要是照片,WebP 或 PNG 二选一,前者瘦后者稳。顺带辟一条流传甚广的谣:把表情包或照片「改后缀转 PNG」不会变清晰,只会让体积暴涨——PNG 没有能力恢复原始 JPEG 量化时已经丢掉的高频,它只是把那些振铃伪影一丝不苟地无损保存了下来。哪张图该走哪条分支,靠猜不如靠数据:把同一张图丢进 图片压缩工具,一次跑出三种格式的体积和肉眼放大对照,十秒钟就能终结一场格式圣战。