一个 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 HDR Headroom “正确”设置为 0.0 的图片,在所有测试环境中均能正确显示 HDR 图像。

上图为 Baseline HDR Headroom “错误”设置为 1.0 的图片,在部分测试环境中只能显示 SDR 图像,好像 Chrome 浏览器没有问题,可以保存到相册试试看。
这些现象表明,查看图片和编辑图片使用了不一样的渲染或判断逻辑,其中有些能够符合 ISO 21496-1 标准的预期行为,有些则没有。这些私有的实现也是带来目前 HDR 图片混乱的一部分原因,当然它们可能综合了自己系统的特点,和用户体验的特别考虑。