标准化的 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 标准的元数据。

从显示效果的层面来看,只要正确的识别和解码,不会与以往的私有格式有区别,只是换了一种存元数据的写法。
识别 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 中叫做 Baseline Image)的 APP2 标记段中,元数据部分为四个字节,存放两个无符号 16 位整数:最低版本(minimum version)和写入器版本(writer version),目前最初版的 ISO 21496-1 中,最低版本应为 0,写入器版本则需要大于等于最低版本。
增益图数据
在增益图中,除了版本信息之外,还包含了生成和解析增益图所需的核心元数据。在 UltraHDR 中,这部分信息存放在 APP1 段的 XMP 数据包里,以文字标签的方式记录,例如增益图的最大值、最小值等。
而在 ISO 标准中,这部分数据的存储方式有所不同:它不再采用 XMP 的“名称 + 数据”形式,而是按照固定的字段顺序和数据类型,将二进制数据直接打包存储。大多数数值以一对 32 位整数:分子与分母形式来表示有理数。这种结构能够保证数值的精度与计算的准确性,但无法像 XMP 那样直接识读,需要经过专门的解析。
具体来说,紧跟在 URN 标识符后面的元数据,其内容和顺序如下:
- 版本信息:与主图一样,头 4 个字节是两个 16 位无符号整数,分别表示最低版本和写入器版本。
- 控制标志 8 位。
- 最高位决定增益图是多通道还是单通道。
- 次高位决定渲染时是否使用基准图像的色空间。
- 其余 6 位为保留位,暂不使用。
- HDR 能力:这部分定义了 SDR 与 HDR 能呈现的亮度之间的关系,也就是通常所说的 Headroom。标准中定义了两个值:
- 基准 HDR 容量:通常为 1。
- 备用 HDR 容量 (Alternate HDR Headroom) 每个值都由一个 32 位分子和一个 32 位分母组成。
- 各通道元数据:根据前面的“控制标志”,这里会包含 1 组(单通道)或 3 组(多通道)数据。每一组都定义了如何将增益图的像素值转换为实际应用的增益系数,包含以下五个关键参数,每个参数同样由分子和分母构成:
gain_map_min/gain_map_max:定义了增益图的原始数据范围。gamma:应用在gain_map_min和gain_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 的使用与效果还有不少误解,但相信其应用会随着标准化的推进越来越广泛。