同一个压缩工具,丢进去一张文字截图它给 PNG-8。丢进去一张风景照它给 WebP 画质 75。我原以为压缩工具都是一个滑杆管到底。这次专门拿 8 张图试了一圈,发现它确实在按图片内容换参数,而且大体换对了。
起因是同事抱怨内部素材站压完的会议截图字边上一圈脏点。那个站是我早年搭的,上传时不管截图还是照片都统一走 JPEG 质量 80。我想先看看现成工具怎么处理这件事。我用的是图映 ImgIng(imging.cn/),开它的图片压缩挨张… 149 加一台 M4 机器。主力样本有四张。两张是我自己用网页排版后截的图:一页虚构的中文会议纪要和一页虚构的订单表格,都是 1280×800。另两张是维基共享资源上的照片,我缩到 1280 宽后存成了无损 PNG。一张是湖景(Lake in Dome Creek / Jakub Fryš / CC BY-SA 4.0),一张是水果摊(Josep M. Gracia / CC BY-SA 4.0)。另外还有两张人像各按证件照尺寸和原图尺寸放了一次,一共 8 张。
文字截图被自动转成了PNG-8
这张图要看两处。中间的提示条写着「检测到图标/线稿 · 已默认 PNG-8 · 256 色」。下面的结果卡片写着 306.6 KB 到 114.1 KB 和 174 色索引 PNG。截图原本只有 174 种颜色而保留上限是 256 色,一个颜色都没丢。我把输出和原图逐像素对了一遍,完全相同。原图有 1402 种颜色的表格截图同样被判成图标/线稿。出来是 256 色的 PNG-8,PSNR 52.84、SSIM 0.9999。走 PNG-8 时界面上的画质滑杆没了。取而代之的是「8 位减色压缩」开关、保留颜色数和抖动开关,旁边还有一句「照片渐变图更推荐 WebP」。
它选得对不对?我用 sharp 在自己电脑上编了一轮对照来验证。文字截图存 JPEG 质量 60 是 123,658 字节,比调色板 PNG 的 116,231 字节还大。表格截图存 JPEG 质量 80 要 111,650 字节。调色板 PNG 只要 58,317 字节,差不多省一半。WebP 质量 80 和调色板 PNG 体积几乎一样,只不过它是有损的。
这张图看「已发货」那个绿底标签的边。JPEG 60 和 80 字周围都有一圈灰色杂点,绿底边缘也发脏。WebP 80 边缘偏软但杂点少很多。调色板 PNG 跟原图看不出差别。同事说的脏点就是 JPEG 这一圈。破案了。
风景照被分到了WebP画质75
这张图看提示条和那排画质按钮。提示写的是「检测到照片 · 已默认 WEBP · 画质 75」。按钮依次是照片 75、平滑 72、纹理 80、图形/文字 84。「照片 75」旁边标着「本图」。结果是 1.42 MB 压到 58.1 KB,PSNR 36.87。切到 JPG 时这排数字变成 80、78、84、88。照片不给 PNG-8 是有道理的。我用 sharp 把两张照片转成 256 色 PNG 后,体积是 JPEG 质量 80 的 2.5 到 3.8 倍。湖景天空那块关掉抖动就出色带,开着抖动又蒙上一层细颗粒。不过色带也不是必然出现的现象。同一张图下方的雾气只有蓝灰一种色调,256 色就看不出色带。容易出事的是颜色丰富、又有大片平滑过渡的照片。
八张里有两张照片被判成截图
它也会看走眼。水果摊那张颜色特别碎,被判成了「截图/界面」并给到画质 84。那张 2996×4200、6.5 MB 的高像素白底人像也被判成截图/界面。好在两张的代价都只是画质档从 75 跳到 84,格式仍是 WebP,没被硬转成 PNG-8。截图这边没有一张被认成照片。水果摊按画质 84 压出来是 187,176 字节,PSNR 35.16,画面没坏,画质高了一档文件自然会大一些。样本只有 8 张,我不敢说它准确率多少。具体按什么判我只能猜,大概和颜色、边缘这类特征有关,猜不准。
回到我那个素材站,改法已经很清楚了。截图和照片分开处理:截图优先用调色板 PNG,照片继续走有损格式。上线前先拿站上最常见的几类图跑一遍对照,看判别会把哪类图分错。