2

我正在写一些东西来获取由富士 3D 相机等相机生成的 MPO 多画面文件中包含的信息。

我有提议的规范,显然是为了混淆而写的,可以从这里获得: CIPA 多图片规范 PDF并导航了正常的 exif 部分并提取了 MFP 信息。

描述标题列表的第 5.2.3 节标题列表:

4 byte endian flag
4 byte offset
-- start of MP Index --
2 byte count
12 byte version
12 byte number of images
12 byte MP entry
12 byte Individual unique ID list
12 byte total number of capture frames
4 byte offset to next IFD.

该图显示了指向偏移量的 MP 条目和唯一 ID 列表(这将产生 12 个字节)。但是,在下面的描述中,它表明 MP 条目应该是每个图像的 16 个字节(在我的带有两个图像的示例图像中,它是),并且每个图像的单个唯一 ID 是 33 个字节(我的示例没有没有这个)。

最多图像的数量,一切都应该是。我有 2 张图片,版本正确,似乎有 3 个块(计数)。但是,第三个块(即 MP Entry)具有正确的代码、正确的字节数和正确的类型,但包含以下信息

32 00 00 00  52 00 00 00  02 00 02 20  40 63  1B 00 
00 00 00 00  00 00 00 00  02 00 02 00  EE 6F  1B 00 

文字说这个的内容应该是

offset   length   name
0x00     4        Individual Image attribute
0x04     4        individual Image Size
0x08     4        Individual image offset
0x10     2        dependant image 1 entry number
0x12     2        dependant image 2 entry number

显然,如果有两个图像(它们实际上是 10MP jpegs)它们的大小为 52 字节和 0,那么这毫无意义。

任何人都可以看看这个并检查我对它的解释是否会发疯,或者有人知道这里应该是什么吗?

抱歉,我知道这有点复杂,但我真的看不出哪里出了问题。

4

2 回答 2

4

我相信你的标签没问题。

规范的第 5.2 章(MP 扩展)规定 MP 索引 IFD 如下:

  • 计数(2 个字节)
  • MP 索引字段(整体结构信息)
  • 下一个 IFD 的偏移量(4 个字节)
  • (MP 指数 IFD)

根据规格,根据图像数量,一切都很好。从 MP 条目标记开始,字节应按如下方式解析:(我将使用从我的 MPO 文件解析的数据)

02 b0 07 00   20 00 00 00   32 00 00 00   52 00 00 00
02 00 02 20   00 13 18 00   00 00 00 00   00 00 00 00
  • 02-b0 - 标签 ID(MP 条目),2 个字节
  • 07-00 - 类型(7 = 未定义),2 个字节
  • 20-00-00-00 - 32(16 x NumberOfImages,我的文件中有两张图片,这个值之前解析过),4字节
  • 32-00-00-00 - 第一个 IFD 的偏移量(50 个字节,从字节序标记开始),4 个字节

这就是 MP 条目数据结束的地方。奇怪的是没有单独的图像唯一 ID 列表(b003)或捕获帧总数(b004)标签,也许它们不是必需的。无论如何,接下来的 4 个字节显示下一个 IFD 的偏移量,即:

  • 52-00-00-00 - 下一个 IFD 的偏移量(82 个字节,从字节序标记开始),4 个字节

第一个 IFD(在我的例子中)在 Next IFD 的偏移之后立即开始:

  • 02-00-02-20 - 单个图像属性,4 个字节
  • 00-13-18-00 - 单个图像大小(在我的情况下为 1 577 728 字节的数据),4 字节
  • 00-00-00-00 - 单个图像数据偏移量(第一个图像的状态为 0),4 个字节
  • 00-00 - 从属图像 1(无从属图像),2 个字节
  • 00-00 - 依赖映像 2(无依赖映像),2 个字节

在您的情况下,数据应解析如下:

32 00 00 00  52 00 00 00  02 00 02 20  40 63  1B 00 
00 00 00 00  00 00 00 00  02 00 02 00  EE 6F  1B 00
  • 32-00-00-00 - 第一个 IFD 的偏移量(50 个字节,从字节序标记开始),4 个字节
  • 52-00-00-00 - 下一个 IFD 的偏移量(82 个字节,从字节序标记开始),4 个字节
  • 02-00-02-20 - 单个图像属性,4 个字节
  • 00-13-18-00 - 单个图像大小(表示 1 794 880 字节数据),4 字节
  • 00-00-00-00 - 单个图像数据偏移量(第一个图像的状态为 0),4 个字节
  • 00-00 - 从属图像 1(无从属图像),2 个字节
  • 00-00 - 依赖映像 2(无依赖映像),2 个字节

并开始下一张图片的数据:

  • 02-00-02-00 - 单个图像属性,4 个字节
  • EE-6F-1B-00 - 单个图像大小(表示 1 798 126 字节数据)、4 字节等。


关于图像大小和偏移

图像大小和偏移量可能会有点混乱。规范说:

“图像大小是 SOI 和 EOI 标记之间的数据”(第 5.2.3.3.2 节)

“数据偏移量(对于第二个图像)是相对于 MP Header 中 MP Endian 字段的地址指定的”(ch. 5.2.3.3.3)

我理解如下:

SOI---MPF_FIELDS-------------EOI 
      ^
      MP endian field
      XXXXXXXXXXXXXXXXXXXXXXXXXXSOI--------------------------EOI

(第一张图片,比如说,SOI 和 EOI 标记之间的 2164288 字节,包括标记。第二张图片,SOI 和 EOI 标记之间的 2221368 字节,包括标记。XXXXX 状态为偏移量)

第二个图像的偏移量意味着 SOI 标记lengthOf(XXXXX)在 MP endian 标记之后的字节开始,它位于第一个图像的 MP 字段中。我怀疑如果你从第一个图像大小中减去偏移值,你应该得到 MP Endian 标记位置。

于 2010-12-14T08:52:04.987 回答
1

我相信基地址是 APP2 标头的 8 个字节,就在“MPF\0”之后和“II*\0”之前,假设是小端。在您提供的十六进制转储中,没有包含 MPO 标签,但我猜“32 00 00 00”指向 MPEntries 的偏移量,而“52 00 00 00”是下一个 IFD 的偏移量。您要查看的是“02 00 02 20”,这可能是第一张图像的属性。

请记住,如果偏移量是“00 00 00 00”,它不是相对的,而是绝对的。

于 2010-11-11T17:38:10.157 回答