逐字节读取 HEIF/HEIC 图像 XMP 元数据

Reading byte by byte HEIF/HEIC images XMP metadata

我正在尝试构建一个本机字节解析器,它给定一个 HEIF 图像 returns 支持它的元数据(主要是图像的宽度和高度)。 目前我正在努力寻找合适的文档和规范来解析此类信息。我必须为 XMP 和 EXIF 元数据做这样的事情,但我们现在只关注 XMP。

我需要的是在哪里找到什么的确切字节结构。根据 HEIF 国际标准文档 (here):

For image items, XMP metadata shall be stored as an item of item_type value 'mime' and content type'application/rdf+xml'. The body of the item shall be a valid XMP document, in XML form.

完美,如果我分析样本图像我可以找到这样的标记:

从现在开始,我无法在任何地方找到如何获取我需要的信息。我希望有人说“前 2 个字节是 header,标记为 0xFF 0xCE(只是一个例子),接下来的 2 个字节是宽度,接下来的 2 个字节是高度......等等”。 就我而言,我是凭直觉去做的。我的样本图像尺寸为 8736x5856。如果我在工具中查找 Big-Endian 2 字节整数 8736,我可以找到它:

嘿,2 个字节后还有 5856 高度:

不过,我再次靠运气和直觉来到这里。我需要一个合适的模式来告诉我在哪里可以找到我可以将其翻译成代码的方式。

我认为您看到的是“mime”和“ispe”mp4 盒,因为 HEIF 是基于 ISOBMFF 的。我建议使用支持 mp4 的工具查看文件,例如 mp4dump、HexFiend 或 fq(注意:我的工具)。 “ispe”(图像空间范围)框我可能是您想阅读的内容。

fq 尚不支持 ispe box,但您可以这样阅读:

$ fq 'grep_by(.type=="ispe").data | tobytes | [.[-8:-4], .[-4:] | tonumber]' file.heif
[
  8736,
  5856
]

所以您可能需要一个基本的 ISOBMFF reader,然后寻找“ispe”框并对其进行解码。如果您只是寻找特定框的第一个,您可能会忽略 ISOBMFF 是一个树结构。