一个 Bug

0.1.2 及以前的 HDR Conversion 中,涉及自动生成 ISO 21496-1 标准元数据的情况下,默认的 Baseline HDR Headroom 会被设置为 1.0 而非 0.0。由于不影响生成的图片在 VS Code 和 Gain Map Demo APP 中的显示效果,这个问题一直未被发现。

最近的一次 Review 里,与之前的草稿代码的对比中,注意到了这个问题,目前已经在 develop 分支中修正,并会在下一个版本中发布。

由于这个 Bug,生成出了一些包含数值为 1.0 的 Baseline HDR Headroom 的图片,因此观测到了一些有趣的现象。

Baseline HDR Headroom

HDR 图像中的 Headroom 尚无正式的中文翻译,可以理解为“拓展空间”,指标称峰值亮度(Nominal Peak Luminance)与参考漫射白亮度(Reference Diffuse White Luminance)之间的比值,并以 $\log_2$ 值表示。

Baseline HDR Headroom 的定义则是基准图像的拓展量,是 gainmap 不被应用时的拓展量。目前绝大多数的 ISO 21496-1 图片的 Baseline 都是完全 SDR,即 Baseline HDR Headroom 为 0,表示基准图像无需拓展亮度。

标准只规定了 Baseline HDR Headroom 和 Alternate HDR Headroom 不能相等,所以写 1.0 其实也是符合标准的,不能说全错,下文会打上引号。

标准中的两个 Headroom 只会影响权重的计算,其中 Target 为显示设备的 Headroom,权重的计算公式为:

$$ W = \text{clamp}\left( \frac{H_{\text{Target}} - H_{\text{Baseline}}}{H_{\text{Alternate}} - H_{\text{Baseline}}}, 0, 1 \right) $$

这也是为什么一个“错误”的 Baseline Headroom 在多数情况下不会影响显示效果。另外,当 Baseline Headroom 大于 Alternate Headroom 时,表示基准图像是 HDR 的,gainmap 用于下变换,这种情况非常罕见。

奇妙的发现

修复前后的代码生成出来的图片,在二进制层面只有一个字节不同,却会在某些应用或操作系统上,出现不同的显示效果。

虽然 ISO 21496-1 格式的 HDR 图片已经标准化,但各种应用和操作系统的支持方式存在差异,为了避免类似逆向研究导致的问题,以后探讨这类话题时,不会再提及具体的应用和操作系统名称,请读者自行测试和发现。

一些地方,这两个图片的显示效果完全相同,这也是完全遵守了 ISO 21496-1 标准时的预期行为。

Baseline HDR Headroom 为 0.0 的图片总是能够正常显示。

而那个“错误”的 Baseline HDR Headroom 为 1.0 的图片,在部分应用或操作系统上,不会触发 HDR 显示,只显示一个 SDR 的 Baseline 图像。

奇妙的是,如果是在一个“相册”类的应用中,还会出现一些额外的现象,包括:

  • 从缩略图点进去查看时,显示 HDR 图像,左右滑动查看其他图片再切回,变成 SDR。
  • 点击“编辑”按钮进入编辑模式时,显示 HDR 图像,退出编辑模式后变成 SDR。

正确 Baseline Headroom

上图为 Baseline HDR Headroom “正确”设置为 0.0 的图片,在所有测试环境中均能正确显示 HDR 图像。

错误 Baseline Headroom

上图为 Baseline HDR Headroom “错误”设置为 1.0 的图片,在部分测试环境中只能显示 SDR 图像,好像 Chrome 浏览器没有问题,可以保存到相册试试看。

这些现象表明,查看图片和编辑图片使用了不一样的渲染或判断逻辑,其中有些能够符合 ISO 21496-1 标准的预期行为,有些则没有。这些私有的实现也是带来目前 HDR 图片混乱的一部分原因,当然它们可能综合了自己系统的特点,和用户体验的特别考虑。