标准化的 Gainmap

之前提到的谷歌 UltraHDR,又或是 OPPO 早期使用的私有格式,还是 Apple 以前的私有格式,虽然名字五花八门,但本质上都是基于 Gainmap 的 HDR 图片方法。

为了标准化这类使用 Gainmap 的图片,Adobe 和 Apple 等公司共同开发了 ISO 21496-1 标准,已经于 2025 年 7 月正式发表,该标准的正式名称是:用于图像变换的增益图元数据(Gain map metadata for image conversion),主要规定了增益图及其相关的元数据,以及如何使用它。

与之前兵荒马乱的各种私有格式相比,该标准在增益图的应用上大同小异,只是在文件中组织数据的方式有些不同。现在,几乎所有的 Gainmap HDR 图像都使用了这一标准。比如 UltraHDR 在 1.1 版本中,就加入了对该标准的支持,同一个图像文件中会同时包含用于 UltraHDR 的 XMP 元数据和符合 ISO 21496-1 标准的元数据。

兼具 ISO21496 的 UltraHDR 结构

从显示效果的层面来看,只要正确的识别和解码,不会与以往的私有格式有区别,只是换了一种存元数据的写法。

识别 ISO 21496-1 元数据

对于 JPEG 文件来说,ISO 21496-1 相关内容存放在 JPEG 的 APP2 标记段中,主图和增益图都需有 APP2,主图中放版本信息,增益图中还要放具体的数据。

参考:https://www.iso.org/standard/86775.html

根据 C.4.6 Gain map metadata 表格的定义,APP2 段的内容布局如下:

  • APP2 标记 (0xFFE2): 2 字节
  • 标记段数据长度:2 字节
  • 唯一标识符 (URN): 28 字节,内容必须是 urn:iso:std:iso:ts:21496:-1,并以一个空字符(null-termination character)结尾。
  • 元数据 (Metadata): 剩余部分 (数据长度减去 30 字节)

ISO 21496-1 的唯一标识符

主图信息

主图(ISO 中叫做 Baseline Image)的 APP2 标记段中,元数据部分为四个字节,存放两个无符号 16 位整数:最低版本(minimum version)和写入器版本(writer version),目前最初版的 ISO 21496-1 中,最低版本应为 0,写入器版本则需要大于等于最低版本。

增益图数据

在增益图中,除了版本信息之外,还包含了生成和解析增益图所需的核心元数据。在 UltraHDR 中,这部分信息存放在 APP1 段的 XMP 数据包里,以文字标签的方式记录,例如增益图的最大值、最小值等。

而在 ISO 标准中,这部分数据的存储方式有所不同:它不再采用 XMP 的“名称 + 数据”形式,而是按照固定的字段顺序和数据类型,将二进制数据直接打包存储。大多数数值以一对 32 位整数:分子与分母形式来表示有理数。这种结构能够保证数值的精度与计算的准确性,但无法像 XMP 那样直接识读,需要经过专门的解析。

具体来说,紧跟在 URN 标识符后面的元数据,其内容和顺序如下:

  1. 版本信息:与主图一样,头 4 个字节是两个 16 位无符号整数,分别表示最低版本和写入器版本。
  2. 控制标志 8 位。
    • 最高位决定增益图是多通道还是单通道。
    • 次高位决定渲染时是否使用基准图像的色空间。
    • 其余 6 位为保留位,暂不使用。
  3. HDR 能力:这部分定义了 SDR 与 HDR 能呈现的亮度之间的关系,也就是通常所说的 Headroom。标准中定义了两个值:
    • 基准 HDR 容量:通常为 1。
    • 备用 HDR 容量 (Alternate HDR Headroom) 每个值都由一个 32 位分子和一个 32 位分母组成。
  4. 各通道元数据:根据前面的“控制标志”,这里会包含 1 组(单通道)或 3 组(多通道)数据。每一组都定义了如何将增益图的像素值转换为实际应用的增益系数,包含以下五个关键参数,每个参数同样由分子和分母构成:
    • gain_map_min / gain_map_max:定义了增益图的原始数据范围。
    • gamma:应用在 gain_map_mingain_map_max 归一化后的增益图数值上的指数。
    • base_offset / alternate_offset:线性 SDR 和 HDR 的偏移量。

我写了一个简单的 Python 脚本,将 APP2 段的二进制数据严格按照上述结构解析为 JSON 格式,可供参考。

JacksBlog Example: ISO 21496-1 解析脚本

各标准的使用情况

只有 ISO 21496-1 元数据的图片是比较少见的,基本都是从原先别的标准拓展而来,所以同时有多种元数据。

只有 ISO 21496-1 元数据的图片有:

  • Phocus 4.0 (HNCS HDR) 输出的 UltraHDR 格式:它虽然名字叫 UltraHDR,但没有相关元数据,只有 ISO 21496-1 相关的。
  • Adobe Sample Gallery:作为标准的推动者,Adobe 提供了一些样张,只有标准元数据。

同时有 UltraHDR 和 ISO 21496-1 的图片:

  • 哈苏 X2D II 的直出 JPEG。

同时有 Adobe Gainmap 和 ISO 21496-1 的图片:

  • Adobe Camera Raw 输出的 HDR JPEG:有 XMP 标识的元数据,也有 ISO 的,但没有 GContainer。
  • 适马 BF 的直出 JPEG。
  • 通过 Project Indigo 拍摄的 JPEG。

仅有 UltraHDR / Adobe Gainmap 的图片:

  • OPPO Find X6 Pro / X8 Ultra 的 JPEG。

另外,如果是 HEIF 等格式,也可以是符合 ISO 21496-1 标准的,但如何识别还不是很清晰,至少不是 URN。比如 iPhone 拍摄的 HEIF 图片,在 Gain Map Demo APP 中可以被识别为 ISO 21496-1 类型。

分久必合

以 Gainmap 存储 HDR 图像的思想,很早就出现了,比如下面这篇 2007 年的文章提出了用两层图片,一层 SDR 和一层残差来记录 HDR。

Okuda, M.; Adami, N. Two-Layer Coding Algorithm for High Dynamic Range Images Based on Luminance Compensation. Journal of Visual Communication and Image Representation 2007, 18 (5), 377–386. https://doi.org/10.1016/j.jvcir.2007.06.004.

最近几年,HDR 图片的风才吹到小小的手机屏幕上,先行者们提出了自己的办法来编码双层图片。一直到今年,才真正完成该格式的国际标准化,结束了百家争鸣的时代。尽管对于 HDR 图片和 Gainmap 的使用与效果还有不少误解,但相信其应用会随着标准化的推进越来越广泛。