前阵子帮朋友处理一批活动照片,他要求单张图片不超过2MB,但原片全是RAW转出来的16bit TIFF,一张就50多MB。我一开始图省事,直接导成JPEG,质量调到80,以为差不多了。结果发过去他一看,说天空部分有一圈圈像水波纹的东西,还有皮肤上也有奇怪的色块。我当时还嘴硬,说是压缩必然的代价。后来我回家自己对比了一下,才发现根本不是必然,是我根本没搞清楚JPEG到底是怎么丢掉信息的。
其实JPEG这玩意儿,专门吃人眼的视觉冗余。它把亮度跟色度分开,然后对色度高频信息下狠手,所以你把质量调到70以下,天空那种渐变区域马上就会出banding,就是那种一圈一圈的条纹。但是如果你先把这个区域的噪点用滤镜抹掉,或者干脆把图片从16bit转8bit之后再做一次轻微的高斯模糊,再存JPEG,同样质量下体积能再小不少,而且肉眼看不出断层。这里有个具体数字:同一张5000万像素照片,直接存JPEG质量80,体积是4.1MB;我用上述步骤预处理后,同样质量80,体积变成2.8MB,但放大到200%看,过渡反而更平滑了。我之前一直以为压缩就是简单的暴力降质,但实际是先要帮它把难压缩的地方处理掉。
至于格式之争,更没网上说的那么绝对。PNG确实是无损,但那是针对RGB值,不是针对像素瑕疵。我的扫描仪扫出来的书籍文件,保存成PNG得占80MB,转成JPEG质量90才3MB。你可以拿一个10倍放大镜去看纸张纹理,PNG完全保留那些颗粒,JPEG会抹掉一部分,可你是为了读书内容,又不是为了欣赏纸张杂质。真正需要无损的地方其实是那种有硬边的图像,比如文档扫描、黑白漫画、UI设计稿,遇到这种情况我直接存PNG,或者转成WebP的无损模式。对了,WebP无损模式普遍比PNG小20%到30%,我用一个2000x2000的矢量logo转位图测试过,PNG是2.1MB,WebP无损是1.5MB,差得很实在。
还有一个被忽略的坑是缩放。很多人拿电脑自带的画图软件把大图缩小,然后抱怨图糊了。这个锅得算法背。画图的默认插值算法很老,相当于把几个像素简单平均,边缘一下子就软了。我平时用IrfanView,批量缩放时把算法从默认的Bilinear改成Lanczos,虽然处理时间会慢一点,但细节轮廓明显保留得更清爽。尤其是原图里有建筑栏杆、树叶缝隙那种高频率纹理的地方,Lanczos和双三次的区别一眼就能看出来。如果你用的是Photoshop,记得在首选项里把默认插值算法改成“两次立方(较锐利)”,但别缩小后自己再叠加锐化,不然很容易出现过深的白色边缘线,这个参数我用固定值0.4像素半径就能压住。
说到底,所谓不损失画质,不是把每个像素都原封不动保住,而是保住你要的那部分信息。我后来给朋友的处理方案是:活动照片保留一份JPEG质量85的高清版(大概3MB左右),再生成一份质量65的预览版(只有800KB),另把全部原始RAW和修过的TIFF存进移动硬盘。因为他的用途是朋友圈发文和微信传阅,这俩地方自己会二次压缩,你给再高的质量过去也会被压成渣,给个清爽的大文件反而是浪费流量。至于真的要打印输出,那另当别论,打印机的色域跟屏幕不一样,你得先转成sRGB再存TIF,JPEG根本没法保证精确的色彩还原。