图片压缩
← 返回博客

压缩瑕疵图鉴:块效应、蚊噪、色带是怎么来的

瑕疵从哪里来:一次 DCT 变换里的取舍

JPEG 的编码流程可以粗略拆成几步:先把图像从 RGB 转到 YCbCr,再按 8×8 像素切块,对每块做离散余弦变换(DCT),然后用量化表把变换系数分别除以不同步长并取整,最后做熵编码。整条链路里真正丢信息的只有量化这一步。

量化表依据人眼的敏感度分布设计:对低频信息(大块明暗、整体轮廓)敏感,对高频信息(细纹理、锐利边缘)迟钝,所以低频系数用小步长精细保留,高频系数用大步长粗暴取整。质量参数越低,步长越大,被抹掉的高频越多。压缩瑕疵就是取整误差留下的可见图案。

还有一条容易被忽略的设定:色度二次采样。绝大多数 JPEG 采用 4:2:0 采样,色度通道 Cb、Cr 的分辨率只有亮度通道的一半。即便亮度细节全部保住,色彩的空间精度从一开始就打了对折。

压缩瑕疵不是笼统的「画质下降」,而是量化误差在特定结构上形成的可预测图案。知道它在哪里出现,就能预判该不该换格式或调参数。

块效应:8×8 网格为什么浮出来

DCT 在每个 8×8 小块上独立完成,块与块之间没有平滑约束,编码器也不保证相邻块重建后的边界能无缝衔接。平坦区域里像素值本来高度接近,代表整块平均亮度的直流系数被粗量化后,相邻块重建出的平均值可能差上一两个色阶。这种落差会被视觉放大成一条直线,横竖排开就是一整片网格。

典型触发条件是低质量加平坦区域:天空、纯色墙面、虚化背景、大面积阴影最容易看出来,细节密集的草丛反而能遮住它。质量在 75 以上通常不明显,掉到 50 以下会成片出现;原图本身干净、噪点少的照片缺少掩盖,网格更扎眼。

蚊噪:锐利边缘周围的振铃

用有限个余弦基去拟合含突变边缘的块,本身就存在类似吉布斯现象的振铃。高频系数被抹掉后,边缘两侧本该陡峭的过渡只能用少数低频分量拼出来,形成围绕边缘的一圈波纹。解码后它表现为紧贴边缘跳动的亮暗噪点,因此得名蚊噪。

蚊噪偏爱高频能量集中的位置:文字笔画、树枝、头发丝、栏杆、逆光轮廓、建筑窗格。这些地方对比度高,需要大量高频系数描述,一旦被粗暴量化就无处可藏。这也解释了为什么同一张照片里人像皮肤看着还算平滑,背景的细枝末节已经碎成一片。质量越低,蚊噪的扩散半径越大。

色带与断层:色度二次采样加上量化过重

平滑渐变需要足够精细的过渡来描述。量化步长变大后,连续的色阶被并进同一个量化区间取整,渐变就断成一条条色块,这就是色带,也叫断层。它和块效应的形态不同:块效应是横平竖直的网格,色带是顺着渐变方向的同心弧线。

色度二次采样会让色带更严重。亮度上的细微过渡还能勉强保留,色彩过渡的精度却只剩一半,于是明暗相对自然、颜色率先裂开——晚霞、天空、影棚背景纸、肤色阴影、暗部渐变是最典型的灾区。8 位色深也是帮凶:可用的色阶本来只有 256 级,量化再并掉一部分,肉眼自然能数出来。

色彩渗漏:边缘长出的伪色

色度分辨率减半还有另一个后果:颜色信息被跨边界平均。一条红色与黑色相接的边,红色像素的 Cb、Cr 值会和相邻黑色像素一起被降采样、平均,重建时颜色被「抹」到对面,出现紫、绿、橙一类原图没有的伪色,这就是色彩渗漏。

高饱和色块的交界处最容易中招:图标边缘、霓虹灯、彩色文字、红底白字的水印。由于亮度通道仍是全分辨率,画面看起来依然清晰,可边缘挂着一圈脏色,观感比单纯模糊更刺眼。想避免它,最稳的办法是改用不丢色度的格式,例如 PNG 或无损 WebP;继续用有损编码就只能把质量提到足够高的水平。

文字截图和线条图为什么最容易暴露

纯色背景加文字的截图,同时踩中量化误差最不擅长的两件事:大面积平坦区域和大量高对比锐利边缘。白色背景是块效应的展示板,笔画边缘是蚊噪的发射源,抗锯齿产生的半透明过渡像素本身就是高频噪声,压在 8×8 网格上反复取整,最终糊成一圈灰边。字形笔画常常只有一到两个像素粗,高频一被砍,笔画就胖瘦不匀。

线条图、图表、流程图、logo 同理。纯色填充加一像素细线,在 4:2:0 采样下细彩色线会掉饱和度、染上邻色,甚至整条消失。再加上聊天软件、办公文档和内容管理系统常会在你不知情时把图片统一转成 JPEG 再压一遍,截图于是被压了两三次,瑕疵层层叠加。

截图、图表、带文字的封面,几乎永远不该存成 JPEG。这类图直接导出 PNG,体积往往更小,画面还更干净。

四类瑕疵速查表

瑕疵 典型表现 直接成因 高发区域 优先处理方式
块效应 平坦区出现 8×8 网格,边缘呈台阶 相邻块低频系数被粗量化,重建均值不一致 天空、纯色墙、虚化背景 质量提到 88 左右,或改用 WebP
蚊噪 强边缘周围出现抖动噪点 高频交流系数被抹掉,产生振铃 文字、树枝、发丝、栏杆 改用 PNG 或无损 WebP,必要时缩小尺寸
色带与断层 平滑渐变变成一圈圈色阶 色度二次采样叠加量化过重与 8 位精度 天空、肤色、暗部渐变 提高质量,改用 WebP,或更换素材
色彩渗漏 高饱和边缘出现紫绿伪色 Cb、Cr 分辨率减半,颜色跨边界平均 红黑交界、霓虹灯、图标色块 改用 PNG,或让编码保留全色度

从工作流上规避,而不是事后修补

  1. 能不用有损就不用。截图、图标、线条图、纯色背景海报优先导出 PNG,调色板 PNG 把颜色数降到 64 至 256 就能明显减重,文字边缘依旧是硬边。用 图片压缩工具 时按画面真实颜色数拉「颜色数」滑杆,想完全不动像素就选无损模式。
  2. 照片只压一次。用 图片压缩工具 时它会读取原图量化表估算原始质量,默认目标质量 80,原图本来就低于 80 时不再继续降质,避免在已压过的图上再砍一刀。
  3. 质量给到 80 至 88,不要一路降到 50。多数照片在质量 80 至 85 之间肉眼已难察觉损失;看到块效应或蚊噪时,应把质量提到 88 左右重压一次,而不是反复微调。
  4. 先缩尺寸,再谈质量。把 4000 像素长边降到 1600 像素,高频总量随之减少,通常比把质量从 85 降到 60 更划算。
  5. 渐变多、色彩重的图换 WebP,同等观感下它通常比 JPEG 更省,色度处理也更克制,可以用 图片压缩工具 把 JPG 转成 WebP 再发布。
  6. 压缩前做完所有编辑。有损是单向的,剪裁、旋转、调色、加水印都应在压缩之前完成。

反复保存 JPEG 的累积劣化

每次「打开再另存为 JPEG」都是一次完整的解码加编码:解码得到的是已经带着量化误差的像素,编码时新的量化表又在这批像素上再取整一次。误差不会抵消,只会叠加,这个过程称为世代损失。更麻烦的是,很多工具保存时会不声不响地换一张量化表,或把质量默认设到 75、80,用户毫无感知。

累积劣化出现的顺序大致有规律:先出现蚊噪和色带,接着是平坦区的块效应,再往后高频细节整片糊掉,最后连大轮廓都出现台阶。经验上,同一张图连续保存三五次,观感下降就已经肉眼可见;如果中间还经过聊天软件、办公文档、内容管理系统的自动二次压缩,次数只会更多。

判断一张图是否已经压过头,可以看三个信号:纯色区域有没有网格或色块,文字和细线周围有没有抖动噪点,渐变里有没有同心色带。任意一条命中,就应回到原始素材重新导出,而不是在残骸上修补。

压缩工具能做的,是把一次压缩做得足够聪明;它做不到的,是把已经丢掉的细节找回来。保护原图、只在最后一步压缩,比任何参数技巧都重要。

换格式还是调质量

选格式的分界很清楚:截图、表格、文字、图标、图表一律 PNG,调色板或无损皆可;照片保持 JPEG、质量 80 至 85,已出现色带或块效应就把质量提到 88 至 92 重压一次,或改用 WebP;只需预览、不需还原细节时,降分辨率比降质量更有效。处理入口可以放在 在线图片压缩,支持 JPG、PNG、WebP、GIF、SVG,全程在浏览器本地处理,可批量与 ZIP 打包下载,并自动移除 EXIF 与 GPS 元数据。参数思路见 图片压缩完整教程,也可以在 博客首页 继续看其他场景的压法。

想直接动手试?打开 在线图片压缩 - 免费压缩 JPEG、PNG、WebP ,把图片拖进去即可,全程在浏览器本地处理。