返回博客
2026年10月27日Sergei Solod10 分钟阅读

如何借助 SSIMULACRA2 选择固定 AVIF 质量值,而不必逐张优化图片

使用 SSIMULACRA2 和目视检查来校准固定的 AVIF 质量值,避免反复编码每张图片。了解如何测量达标率、比较文件大小,并选择实用的设置。

AVIFSSIMULACRA2图像压缩Sharp图像优化

如果只考虑文件大小,选择 AVIF 的质量参数并不难。难的是判断多大程度的可见画质损失可以接受。质量值设为 40,并不意味着感知质量评分就是 40,也无法保证所有图片的结果一致。即使使用相同的编码器设置,不同来源的图片也可能表现出很大差异。

SSIMULACRA2 可以通过比较压缩后解码的图片与参考图片,帮助评估这种差异。但如果对每张图片都进行穷举式质量搜索,原本直接的转换流程就可能变成计算成本高昂的编码任务。如果目标是获得适合网页使用的合理画质,而不是为每个文件追求极致优化,还有一种更简单的办法:先用有代表性的样本校准一个 AVIF 质量值,目视检查结果,再将这一设置用于其余图片。

AVIF 质量参数与 SSIMULACRA2 评分不是一回事

传给 AVIF 编码器的 quality 参数是一项压缩设置,而 SSIMULACRA2 衡量的是编码结果。两者的数值范围不能直接对应:AVIF 的 quality: 40 并不意味着 SSIMULACRA2 一定等于 40、60 或其他某个固定分数。

要评估一次编码的结果,先将压缩文件解码,再与参考图片比较:

ssimulacra2 reference.png encoded-decoded.png

SSIMULACRA2 分数越高,表示感知上的相似度越高。其官方文档将大约 50 分描述为中等画质,将大约 70 分描述为高画质。把 60 分作为阈值可以是一个务实的选择,但这是一项人为制定的标准,并非普遍适用的合格画质定义。始终应以图片实际展示时的尺寸,目视检查具有代表性的结果。

为什么逐张穷举优化的成本很高

严格的优化器可以针对同一张图片,用不同的质量值反复编码,再通过 SSIMULACRA2 测量每个候选结果,最后保留满足要求且文件最小的版本。这种方法通常能获得更高的压缩效率,因为容易压缩的图片可能在较低质量值下就达标,而难处理的图片需要更高的设置。

缺点是编码次数。如果有 N 张图片,每张需要尝试 K 个候选编码才能找到合格设置,那么编码次数的量级就是 N × K,此外还要进行解码和评分。实际操作中,高 effort 设置下的 AVIF 编码可能是主要成本;运行 SSIMULACRA2 指标本身未必是最耗时的环节。

为每个文件夹选择一个质量值,虽然能减少搜索工作,但仍需对不同分组进行抽样、测量,并维护各自的设置。对于交付画质要求一致、又允许少量异常图片的集合,这些额外复杂性未必值得。

策略校准工作量主要取舍
逐张自适应质量每张图片尝试多个候选编码控制最精细,但校准成本最高
按组自适应质量为每组样本尝试多个候选编码工作量较少,但配置更多,结果随分组而变化
统一固定质量只对有限的校准样本尝试候选编码操作复杂度低,但接受部分图片压缩过度或不足

关键区别:平均分与达标率

选择质量值之前,需要先定义什么叫“足够好”。下面两种看似相近的目标,可能导向截然不同的编码器设置:

  • 平均分目标:样本的 SSIMULACRA2 平均分应约为 60。
  • 达标率目标:约 90% 的图片应达到 SSIMULACRA2 ≥ 60,其余图片可以低于这一阈值。

这两种目标并不等价。计算平均值时,简单图片的高分可以抵消难处理图片的低分。例如,一半图片得 75 分,另一半得 55 分,平均分就是 65,但实际上只有一半的图片达到了 60 分的阈值。

对于一般的网页图片流程,如果希望大多数图片看起来可以接受,并且能够容忍少数不达标的情况,达标率往往更有参考价值。可以这样计算:

pass_rate = count(scores >= 60) / count(all_scores)

还要记录未达标图片的分数分布,并检查视觉效果最差的图片。即使达标率相同,9% 的图片得 59 分,与 9% 的图片只得 30 分,所代表的情况也明显不同。

一次实际校准得出了什么结果

在一次探索性的 AVIF 校准中,自适应流程为不同图片组选择了不同的质量设置,大致从 30 多的中段延伸到 40 多的中段。这符合预期:有些分组的图片较早就超过选定的 SSIMULACRA2 阈值,而少数难处理的样本需要高得多的编码质量。

不过,自适应规则比真正的交付要求更严格。它试图让每组中几乎所有测试图片都达到阈值,仅对极少量异常值放宽限制。这有助于保护难处理的图片,但也可能仅因为一个特殊样本,就将整组图片的质量设置提高。

如果按另一项目标重新审视测量数据——大约十张图片中有九张达到 SSIMULACRA2 60 分或以上——那么使用一个约 39–40 的统一 AVIF 质量值,就成了一个看似合理的折中方案。在该比较中,39 更偏向减小输出体积,40 则为接近阈值的图片留出更大余量。这些数值来自校准数据及后续分析;当时尚未完成采用固定质量值的全量转换,也未在整个图片库上进行独立验证。39 相比 40 具体能节省多少文件体积,也尚未确定。

这里的结论并不是 AVIF 质量值 39 或 40 适用于所有情况,而是当固定设置符合明确选定的画质分布目标时,它可以是合理选择。换一种编码器、图片构成、色彩处理流程或感知质量阈值,答案就可能不同。

如何一次性校准 AVIF 质量

  1. 确定可接受的未达标比例。例如,要求约 90% 的图片达到 SSIMULACRA2 ≥ 60。先明确这是一个可以灵活掌握的目标,还是严格的发布要求。
  2. 构建真正有代表性的样本。涵盖不同尺寸、来源格式、渐变、清晰边缘、纹理和低细节图片。从实际工作负载中随机抽样;如果某一类别可能被遗漏,就采用分层抽样。按压缩后每像素字节数选取文件,有助于覆盖不同情况,但不能保证样本在感知质量上具有代表性。
  3. 测试一小段质量参数范围。从目视效果可以接受的设置附近选几个候选值开始,而不是遍历整个质量范围。例如,在同一批图片上测试 38、39、40 和 42。
  4. 保持编码流程完全一致。固定分辨率、方向、色彩转换、编码器实现、effort、色度子采样、位深度和预处理步骤。如果添加水印,用来比较的参考图片也必须包含相同的水印和变换。
  5. 同时记录评分与体积。对每个候选值,统计得分至少为 60 的图片比例、低于阈值的分数分布,以及同一批样本的编码后总字节数。不能仅凭质量参数推断能节省多少带宽。
  6. 检查未达标的图片。重点查看人脸、文字、细线、渐变,以及其他影响目标展示效果的细节。应在真实的展示尺寸下检查,而不只是放大对比。
  7. 选出满足要求的最低质量值,然后验证。用一批未参与参数选择、单独随机抽取的留出样本测试候选值。如果未达到 90% 的目标会带来较高代价,就留出安全余量,并认真考虑抽样的不确定性。如果偶尔不达标也可以接受,选择更激进的数值可能合理。

一次性校准并不意味着以后可以忽略变化。当来源图片的构成、尺寸、编码器版本、交付时的图像变换或视觉要求发生变化时,应重新进行小规模抽样检查。

使用 Sharp 和 SSIMULACRA2 进行最简对比

下面的简化示例使用 Sharp 的 AVIF 编码器从同一输入生成两个候选版本。这只是用于说明校准过程的代码示例,并不表示所有项目都应该采用这些编码器选项或质量值。安装 sharp 后,以 ES 模块方式运行。

import sharp from 'sharp';

const source = 'sample.png';
const encoding = {
  effort: 9,
  chromaSubsampling: '4:4:4',
  bitdepth: 8,
  tune: 'iq',
  lossless: false
};

// Use the same orientation and color conversion in both paths.
await sharp(source)
  .rotate()
  .toColourspace('srgb')
  .png()
  .toFile('reference.png');

for (const quality of [39, 40]) {
  const encoded = `candidate-q${quality}.avif`;
  await sharp(source)
    .rotate()
    .toColourspace('srgb')
    .avif({ ...encoding, quality })
    .toFile(encoded);

  await sharp(encoded)
    .png()
    .toFile(`candidate-q${quality}.png`);
}

然后,将解码后的候选图片与准备好的参考图片比较:

ssimulacra2 reference.png candidate-q39.png
ssimulacra2 reference.png candidate-q40.png

在真实测试中,应对所有抽样图片自动执行这个过程,并收集每个候选设置对应的评分和文件大小。如果生产流程会对图片进行缩放、裁剪、叠加图层或其他变换,那么参考图片也应经过同样的处理。否则,SSIMULACRA2 测量到的部分差异将来自这些变换,而不只是压缩损失。

选定全局质量值之后,生产阶段就变成普通的单次 AVIF 编码。无需再为每张图片或每个文件夹搜索质量参数。这样省去了反复尝试编码的工作,但并没有消除每张输出图片仍需进行一次编码的成本。

什么时候不该使用统一的 AVIF 质量值

固定质量是一种取舍,并非通用的最优解。如果每张图片都必须满足合同约定的最低画质、无法接受视觉缺陷、来源图片差异极大,或者逐字节优化带来的收益足以抵消额外算力与实现复杂度,那么自适应编码仍然有价值。

混合图片类型尤其需要谨慎。照片、纯色图形、细小文字和已经压缩过的图片,未必会对相同设置作出相似反应。如果某一类图片反复无法通过验收测试,采用少数几个按格式或内容类型划分的配置,可能比两个极端——完全统一的质量值或全面逐张优化——都更高效。

此外,还要区分编码速度与校准速度。统一质量值可以避免重复试验,但如果所有图片仍以非常高的 effort 编码,计算成本依然可能很高。降低编码器的 effort 也是一种合理的优化方法,不过必须重新校准,因为改变编码选项后,质量参数与评分之间的关系可能发生变化。

实用原则

把 SSIMULACRA2 当作校准工具,而不是每张图片在生产流程中都必须执行的步骤。根据图片实际的观看方式确定画质目标,用几个相近设置编码有代表性的样本,同时比较感知质量评分与字节数,检查失败案例,然后锁定满足容忍范围的最低设置。

在一次探索性校准中,约 39–40 的 AVIF 质量值看起来是一个合理的停靠点。这是在特定阈值与容忍度下作出的判断,并非通用预设,也不是经过全库基准测试确认的结果。更有普遍意义的经验是:当时间和计算资源有限时,经过认真验证的固定质量值,往往比无休止地逐张优化更实用。