导出图片的时候,那个 JPEG 质量滑杆,你是不是一直当百分数在用?拖到 80,心里想的是“保住了八成画质”;拉到 100,觉得“这下一点没丢”。
这个理解得整个推翻:滑杆上的数字跟“百分之多少的画质”没有任何关系,质量 100 也不是无损。先把能直接上手的结论放这儿——照片想存得放心,放 85–92;往网页和社媒发,75–82 足够;100 别设成默认,它只会把体积翻倍甚至三倍,画质一点不多。下面说大白话,把这个滑杆掰开。
一句话说清:JPEG 质量滑杆控制的不是“保留多少画质”,而是量化表里那组除数有多狠——除数越大,取整越狠,丢得越多。它跟画质、跟体积都不是线性关系,100 到 90 的变化不等于 20 到 10 的变化。
先立个前提:JPEG 是有损格式,从你按下保存那一刻起就在丢东西,滑杆只决定“丢多狠”,不决定“丢不丢”。它的丢法有一套固定流程,滑杆是这条流水线上最后一道闸门。
保存时,图先从 RGB 转成 YCbCr,把亮度和颜色分成两路。这么分是因为人眼看亮度比看颜色在行得多,先分离,后面才好重点保亮度。
接着,整张图被切成 8×8 像素的小块,每块做一次离散余弦变换(DCT),把像素颜色换算成一串频率值。可以类比成把和弦拆成单个音符:低频是画面的底色和渐变,高频是锐利的边缘和细碎的纹理。这套流程的完整版,维基百科的 JPEG 词条写得很全。
真正的杀招在最后一步:每个频率值都要除以量化表(Quantization Table)里的一个数字,再四舍五入取整。取整,就是信息永久死亡的地方——除不尽的零头直接扔掉,回不来了。质量滑杆管的,就是这些除数有多狠:滑杆数值高,除数就小,取整几乎不伤数据;滑杆数值低,除数就大,取整直接把细节抹平。而高频分量的除数涨得更快,所以每次先牺牲的,都是边缘和细纹理。
所以它才当不了百分比。从 100 拉到 90,和从 20 拉到 10,除数的变化完全是两码事,画质和体积的落差也完全不一样——在 90 附近拖一格,你可能毫无感觉;在 20 附近拖一格,图就废了。把它当百分数理解,是这个控件上最常见也最贵的误会。
先给答案:100 离无损还差着两道硬伤,一道不看滑杆脸色,一道连滑杆也救不了。
第一道是色度子采样(chroma subsampling)。RGB 转 YCbCr 之后、压缩真正开始之前,大多数编码器就先把约 75% 的色度细节丢掉了,理由还是那条:人眼对颜色迟钝,丢了也看不出来。这一步压根不归滑杆管,你设 100 也照样执行。
第二道是数学本身不干净。就算量化表里的除数已经放到最小,“像素变频率、频率再变回像素”这一来一回,还是有细小的舍入误差。存出来的文件解开,已经不是你按保存键时的那批像素了。
真要一比特不丢,请走无损路线:PNG、TIFF,或者 WebP 的无损档。有损是单行道,JPEG 的任何一档都一样,包括那个看起来“完美”的 100。
大量的实测和像素级对比,最后都落在一个很清晰的分界上:两个区间,覆盖几乎所有场景。
85–92 是保留档。作品集、要交客户的片子、你舍不得动的那批原图,放这档。质量 90 存出来的文件,大约是未压缩的 1/8 到 1/12,而差异肉眼看不见——你得放大到 400%、盯着某一小块,才挑得出变化。
75–82 是网页档。网站配图、社媒上传,放这档。文件比保留档再小 40%–60%,代价主要是复杂纹理的地方轻微发软,正常看图基本察觉不到。
看过上一篇《有损与无损》的话,那里给的 80–85 甜点区跟这两档并不冲突:80 上下本来就在网页档里,85 正好迈进保留档,已经按 80–85 存过的图不必回炉重压。
三个档位归拢成一句话:要留着的东西放 85–92,发出去的东西放 75–82,60 以下是雷区,绕着走。
出口默认拉 100,是焦虑,不是策略。质量 85 的文件,比质量 100 小 60%–75%,画质上却看不出任何差别;对网页来说,这就是白白把加载时间拉长——网站图片这笔账,我在网页图片提速那篇里细算过。
滑杆过 60 再往下,画质掉的不是坡,是崖。
原因还是取整。数值太低时,高频分量的除数大到离谱,一个频率值除完再四舍五入,直接归零——这个细节等于没存。于是整类视觉信息成批消失:发丝、织物的织纹、衬线字的笔画尖端,都是最先没的那批。
留下来的画面,就是标准的 JPEG 伪影:一片一片的 8×8 色块、渐变里的一圈圈色带、锐边旁边的毛边和蚊式噪声(mosquito noise)。大形状还在,可这张图已经不算“给人看的图”了。伪影的每一种长相怎么来的,我单独写过一篇图解。
所以我的结论是:60 就是普通图片的实际下限。再往下省的那几 KB,换来的东西一眼假,不值。
“质量 90”不是通用货币。JPEG 规范给出了一组推荐量化表(Annex K),但每家软件用哪张表、怎么缩放,是各家自己定的。同样是“高质量”,四个常见工具给出的数字长得完全不一样:Photoshop 的刻度是 0–12,它的 10 大约相当于参考实现 libjpeg 的 90;GIMP 和 ImageMagick 都是 1–100 的刻度,GIMP 的“高质量”档取 85,ImageMagick 取 92;libjpeg 作为参考实现,自己的参考值是 90。
两个工具都设“质量 85”,导出来的文件也不会一样。所以别在一个软件里记住一个数、换到另一个软件照搬。跨软件、跨项目比较,可靠的办法只有两个:看实际输出体积,看实际画面效果。
滑杆靠不住,肉眼又受屏幕和状态影响,“看不出差别”这件事还能不能量化?能,靠谱得多的做法是换一把尺子:结构相似性指数(SSIM,Structural Similarity Index Measure)。
它不逐个比像素,而是看结构、亮度、对比度三样东西变了多少,比“数一数有多少像素不一样”更接近人眼判图的方式。分数从 0 到 1,1 就是两张图完全一样。公式和来龙去脉,维基百科的 SSIM 词条讲得清楚。
对着常见的质量档位,SSIM 大致是这个水平:质量 85 的文件一般能拿到大于 0.97 的分数,与原图视觉不可分;掉到 60,分数落在 0.90–0.93,轻微发软,放大才看得见;到了 40,只剩 0.82–0.87,伪影已经肉眼可见。
这组数字比滑杆诚实得多。想不靠猜来定质量,可以用 ImageMagick 的 compare 命令直接算两张图的 SSIM,把“体积省到最多、又不跌破 0.85 这条感知线”的点找出来。这把尺子的用法,我单独写了一篇SSIM 深讲。
下面这个小工具完全在你的浏览器里跑,图片不上传。选一张图(或点“试用示例图”),拖滑杆看压缩后体积和 SSIM 怎么变;也可以让工具自动找一个“体积最小、SSIM≥0.85”的档位。SSIM 分数实时算在你刚压缩出来的图上——这正是上一节说的那把尺子。
注:浏览器原生 JPEG 编码器不开放色度子采样与量化表的控制权,所以这里做的是“如实呈现滑杆效果 + 用 SSIM 量化差别”,而不是让你改编码底层参数——这正好印证了文章里“100 也不是无损、跨软件同一数字结果不同”的说法。
绝大多数时候 80 上下就够,100 不该当默认。质量 85 的文件,比质量 100 小 60%–75%,肉眼却看不出任何差别;照片要保险就放 85–92,网页和社媒 75–82 足够,低于 60 会出明显伪影。
不是。就算拉满 100,JPEG 也通常先在色度子采样里丢掉约 75% 的颜色细节,再经过量化和取整造成不可逆的损失。要无损,请用 PNG、TIFF 或无损 WebP。
Photoshop 的 JPEG 质量刻度是 0–12,不是 1–100,它的 10 大约相当于参考实现 libjpeg 的 90。各家软件对同一数字的映射不同,跨软件别照搬数字,以实际输出体积和画面效果为准。
放大对比原图最直接;要客观指标就用 SSIM。质量 85 的 JPEG 一般 SSIM 大于 0.97,与原图视觉不可分;40 左右跌到 0.82–0.87,伪影肉眼可见。ImageMagick 的 compare 命令可以直接算出这个分数。
滑杆上那个数字是除法参数,不是画质百分比;100 不是无损,60 以下是悬崖。真要一句口诀:照片存 85,往网页发的存 80,100 哪儿都不用去——文件翻倍,画质一分没涨。
想从选格式、改尺寸一路顺到调质量和网页提速,去看图片压缩完全指南,整条链都在那一篇里。