我正在写一些东西,以获取由富士3D相机等相机生成的MPO多画面文件中包含的信息。
我有建议的规范,显然是为了混淆而写,可以从这里获得: CIPA multi picture spec 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 Entry和Unique 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。
任何人都可以看看这个并检查我对它的解释不会生气,或者有人知道应该在这里发生什么吗?
抱歉,我知道这有点复杂,但我真的看不出这出错的地方。
答案 0 :(得分:4)
我相信你的标签还可以。
规范的第5.2章(MP扩展)规定MP索引IFD如下:
根据规格,一切都很好。从MP Entry标记开始,字节应解析如下: (我将使用从我的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
那是MP条目数据的终点。奇怪的是,没有单个图像唯一ID列表(b003)或捕获帧总数(b004)标记,可能它们不是必需的。无论如何,接下来的4个字节显示下一个IFD的偏移,即:
第一个IFD(在我的情况下)在Next IFD的偏移后立即开始:
在您的情况下,数据应解析如下:
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
开始下一张图片的数据:
图像尺寸和偏移可能会有点混淆。规则说:
“图像大小是SOI之间的数据 和EOI标记“(ch.5.2.3.3.2)
和
“数据偏移(对于第二个图像)是 相对于地址指定的 MP标题中的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标记在MP结束标记之后的lengthOf(XXXXX)
个字节中开始,该标记位于第一个图像的MP字段中。
我怀疑如果你从第一个图像大小中减去偏移值,你应该得到MP Endian标记位置。
答案 1 :(得分: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”,则它不是相对的,而是绝对的。