图片压缩后变糊、导出后发灰?一套能落地的图片加工导出流程

关键词:图片压缩, 色彩空间, 图片锐化, sRGB, WebP

摘要:从色彩空间偏移到 JPEG 色度降采样,拆解图片导出后发灰、压缩后发糊的真实原因,附 ImageMagick 与 cwebp 的具体参数、锐化数值和批处理思路。

去年冬天给一个淘宝店做详情页,我在 iMac 上调了整整两天,卖家收到图后截屏发我,说「你这图怎么灰扑扑的」。我第一反应是他屏幕太烂。后来让他把原图发回来,我用取色器量了一下,同一块红色,我这边是 #D93A2B,他那台机器上显示成 #C6453A,明度也掉了一截。

图片

数值没变,变的是解读方式。iPhone 从 7 开始默认用 Display P3 拍照片,P3 的色域比 sRGB 宽大约 25%,红绿两个方向尤其明显。你在手机相册里看是正常的,因为系统知道这是 P3 图,会正确映射;但很多电商后台、老版看图软件、甚至某些 CMS 的缩略图服务,会把 icc profile 直接丢掉,然后把 P3 的数值当成 sRGB 来渲染。R 通道的数字还是那个数字,含义却换了,红色自然就往下掉一档。

修的办法不算难,导出前统一转成 sRGB。但 PS 里有两个菜单长得几乎一样,结果完全相反:「转换为配置文件」和「指定配置文件」。转换会重新计算每个像素的数值,让眼睛看到的颜色尽量不变;指定只是给文件贴个标签,数值原封不动,颜色会当场跳一下。我早年图快用过「指定」,那一批图的草绿色全部偏成了橄榄绿,返工到凌晨三点。还有个容易忽略的细节:ImageMagick 的 -strip 参数会清掉所有元数据,其中就包括 icc profile。如果你在转换之前就 strip 了,那张 P3 图会变成一个没有身份的文件,浏览器默认按 sRGB 处理,照样偏色。正确顺序是转换、再 strip,这一步我教过不下十个人,一半人栽在这。

图片

色彩之外,另一个常见抱怨是「压完就糊」。多数人的做法是原图直接拖进压缩工具,把质量滑块拉到 60,看着文件小了就满意了。问题是 JPEG 在压缩前会做色度降采样,默认 4:2:0,也就是颜色的分辨率只有亮度的四分之一。对风景照影响不大,但凡图里有细文字、红色 logo、UI 截图,边缘就会开始渗彩色噪点。我做过一组对照:一张 4000×3000 的旅行照,直接按 q60 导出,文件 512KB,放大到 100% 能看到明显的块状色斑;同一张图先用 1600×1200 重采样,再按 q85 导出,文件只有 218KB,细节反而更干净。原因不复杂,像素少了 84%,每个像素能分到的比特数就多了,编码器不用那么激进地砍信息。所以「先缩后压」和「先压后缩」,出来的东西完全不是一个档次。

图片

对带文字或者线稿的图,我会把 sampling-factor 设成 1x1,也就是 4:4:4,不做色度降采样。代价是文件大概大 15% 到 25%,但红色小字不会糊成一团,照片就没必要了,4:2:0 够用。缩图本身会损失高频细节,所以缩完补一点锐化是划算的。我常用的 USM 参数是半径 0.6 到 0.9,数量 50 到 80,阈值 2 到 4。半径绝对不要超过 1 像素,超过就会在边缘外面生成白边和黑边,看着像抠图抠脏了。另外锐化要放在压缩之前,锐化增加的是高频信息,先压再锐化,等于把压缩产生的噪点一起放大。

真正让我省下时间的是把流程写成命令。我现在的照片处理一条命令搞定:

图片

magick input.jpg -colorspace sRGB -resize "1600x1600>" -unsharp 0x0.75+0.6+0.02 -sampling-factor 4:2:0 -quality 86 -strip output.jpg

图片

拆开看:-colorspace sRGB 是先统一色彩空间,-resize 后面引号里的 > 表示只缩不放,-unsharp 的三个数分别是半径、数量、阈值,-strip 必须放在最后。批量的话前面套个 for 循环,或者用 mogrify 直接跑目录,几百张图两分钟能跑完。WebP 那边我用 cwebp -q 82 -m 6 -sharp_yuv,q 82 是我试下来和 JPEG q86 观感接近的档位,-m 6 是最慢但最省体积的模式,批量跑的时候就看你能不能等。

最后说个容易忽略的点。网页上做 2x 图适配的人不少,但很多人给 2x 图用了和 1x 一样的质量参数,结果文件平白大了接近四倍。实际上 2x 图在物理屏幕上每个 CSS 像素对应两个物理像素,同样的压缩瑕疵被缩小了一半,视觉上几乎看不出来。所以 2x 图完全可以把质量档再降 5 到 8 个点,比如 1x 用 q88,2x 用 q82,体积能省掉三成左右。

图片

绕了一圈,我的结论其实挺朴素的:图片加工这件事,重点不在于你能保留多少,而在于你清楚该放弃什么。色彩空间放弃 P3 换成 sRGB,换来的是所有人看到的都是同一张图;分辨率放弃多余的像素,换来的是更小的文件和更干净的编码。真正让人抓狂的从来不是技术难度,是你不知道问题出在哪一环。把导出这一环固定成预设,剩下的时间拿去做图本身吧。

标签: