gpt4 book ai didi

exif - 关于十六进制格式的EXIF的问题

转载 作者:行者123 更新时间:2023-12-02 10:05:48 28 4
gpt4 key购买 nike

我试图了解 jpeg 文件(十六进制)的 EXIF header 部分以及如何理解它,以便我可以提取数据,特别是 GPS 信息。无论好坏,我都在使用 VB.Net 2008(对不起,这是我现在可以掌握的)。我已经将 jpg 的前 64K 提取到一个字节数组中,并且对数据的排列方式有一个模糊的概念。使用 EXIF 规范文档,版本 2.2 和 2.3,我看到有标签,应该对应于文件中的实际字节序列。我看到有一个值为 8825(十六进制)的“GPS IFD”。我在文件中搜索十六进制字符串 8825(我理解为两个字节 88 和 25),然后我相信 8825 后面有一个字节序列。我怀疑那些后续字节表示文件中的位置,通过偏移的方式,GPS 数据将被定位。例如,我有以下十六进制字节,以 88 25 开头: 88 25 00 04 00 00 00 01 00 00 05 9A 00 00 07 14. 我要查找的字符串是否超过 16 个字节?我的印象是,在这串数据中,它应该告诉我在哪里可以找到文件中的实际 GPS 数据。

看着 http://search.cpan.org/~bettelli/Image-MetaData-JPEG-0.153/lib/Image/MetaData/JPEG/Structures.pod#Exif_and_DCT ,在页面的中间,它谈到“每个 IFD 块都是一个结构化的记录序列,在 Exif 行话中称为互操作性数组。第 0 个 IFD 的开头由“IFD0_Pointer”值给出。 IFD 的结构如下:

那么,什么是 IFD0_Pointer?它与偏移量有关吗?我认为偏移量从一开始就是这么多字节。如果这是真的,那起点在哪里?

感谢您的任何回复。

戴尔

最佳答案

建议您阅读 Exif Specification (PDF);它很清楚而且很容易理解。对于简短的入门,这里是 article 的摘要我写:

JPEG/Exif 文件以图像标记 (SOI) 的开头开始。 SOI 包含两个魔术字节 0xFF 0xD8 ,将文件标识为 JPEG 文件。在 SOI 之后,有许多应用标记部分(APP0、APP1、APP2、APP3……),通常包括元数据。

应用标记部分

每个 APPn 部分都以一个标记开始。对于 APP0 部分,标记为 0xFF 0xE0 , 对于 APP1 部分 0xFF 0xE1 , 等等。标记字节后跟两个字节,表示节的大小(不包括标记,包括大小字节)。长度字段后跟可变大小的应用程序数据。 APPn 部分是连续的,因此您可以跳过整个部分(通过使用部分大小),直到到达您感兴趣的部分。 APPn 部分的内容各不相同,以下仅针对 Exif APP1 部分。

Exif APP1 部分

Exif 元数据存储在一个 APP1 部分(可能有多个 APP1 部分)。 Exif APP1 部分中的应用程序数据包含 Exif 标记 0x45 0x78 0x69 0x66 0x00 0x00 ( "Exif\0\0" )、TIFF header 和许多图像文件目录 (IFD) 部分。

TIFF 标题

TIFF 头包含有关 IFD 部分字节顺序的信息和指向第 0 个 IFD 的指针。前两个字节是 0x49 0x49 ( II 对于英特尔)如果字节顺序是小端或 0x4D 0x4D ( MM 对于摩托罗拉)用于大端。下面两个字节是魔术字节0x00 0x2A ( 42 ;))。以下四个重要字节将告诉您从 TIFF header 开始到第 0 个 IFD 的偏移量。

重要提示: JPEG 文件本身(到目前为止您一直在阅读的内容)将始终采用大端格式。但是,IFD 子节的字节顺序可能不同,需要进行转换(您从上面的 TIFF header 中知道字节顺序)。

图像文件目录

一旦你走到这一步,你就有了指向第 0 个 IFD 部分的指针,你就可以阅读实际的元数据了。其余的 IFD 在不同的地方被引用。 Exif IFD 和 GPS IFD 的偏移量在第 0 个 IFD 字段中给出。在第 0 个 IFD 字段之后给出第一个 IFD 的偏移量。 Exif IFD 中给出了互操作性 IFD 的偏移量。

IFD 只是元数据字段的顺序记录。字段计数在 IFD 的前两个字节中给出。字段计数之后是 12 字节字段。在这些字段之后,从 TIFF 头的开始到第一个 IFD 的开始有一个 4 字节的偏移量。该值仅对第 0 个 IFD 有意义。在此之后,是 IFD 数据部分。

IFD 字段

字段是 IFD 部分的 12 字节子部分。每个字段的前两个字节给出了 Exif 标准中定义的标签 ID。接下来的两个字节给出了字段数据的类型。您将拥有 1byte , 2ascii , 3short ( uint16 ), 4long ( uint32 ) 等。请查看 Exif 规范以获取完整列表。

下面四个字节可能有点困惑。对于字节数组( asciiundefined types ),给出了数组的字节长度。例如,对于 Ascii 字符串:"Exif" ,计数将为 5,包括空终止符。对于其他类型,这是字段组件的数量(例如 4 个短裤,3 个有理数)。

在计数之后,我们有 4 字节的字段值。但是,如果字段数据的长度超过 4 个字节,则会将其存储在 IFD 数据部分中。在这种情况下,该值将是从 TIFF 头开始到字段数据开始的偏移量。例如,对于 long ( uint32 ,4 字节),这将是字段值。对于 rational ( 2 x uint32 ,8 字节),这将是 8 字节字段数据的偏移量。

这基本上就是元数据在 JPEG/Exif 文件中的排列方式。有一些注意事项要记住(记住根据需要转换字节顺序,偏移量从 TIFF header 的开头开始,跳转到数据部分以读取长字段,...)但格式很容易阅读.以下是 JPEG/Exif 文件的颜色编码的十六进制 View 。蓝色块代表 SOI,橙色是 TIFF 头,绿色是 IFD 大小和偏移字节,浅紫色块是 IFD 字段,深紫色块是字段数据。

HEX View of a JPEG/Exif File

关于exif - 关于十六进制格式的EXIF的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7555842/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com