关于十六进制形式的EXIF的问题

Dal*_*ord 6 hex exif

我试图了解jpeg文件的EXIF标题部分(十六进制)以及如何理解它,以便我可以提取数据,特别是GPS信息.无论好坏,我使用VB.Net 2008(对不起,这是我现在能掌握的).我已经将jpg的第一个64K提取到字节数组,并且对数据的排列方式有一个模糊的概念.使用版本2.2和2.3的EXIF规范文档,我看到有些标记应该与文件中的实际字节序列相对应.我看到有一个"GPS IFD",其值为8825(十六进制).我在文件中搜索十六进制字符串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?它与偏移量有关吗?我假设一个偏移量是从一个起点开始的那么多字节.如果这是真的,那个起点在哪里?

感谢您的回复.

戴尔

Ozg*_*tak 16

我建议你阅读Exif规范(PDF); 这很清楚,很容易理解.对于简短的入门,这里是我写的文章的摘要:


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

应用标记部分

每个APPn部分都以标记开头.对于APP0部分,标记是0xFF 0xE0APP1部分0xFF 0xE1,依此类推.标记字节后跟两个字节的大小(不包括标记,包括大小字节).长度字段后跟可变大小的应用程序数据.APPN部分是连续的,这样就可以跳过整个章节(通过使用截面尺寸),直到你到达一个你感兴趣的.APPN部分的内容有所不同,下面是对的Exif APP1部分只.

Exif APP1部分

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

TIFF标题

TIFF头包含有关IFD部分的字节顺序和指向第0个IFD的指针的信息.前两个字节是0x49 0x49(II对于Intel)如果字节顺序是little-endian或0x4D 0x4D(MM对于Motorola)对于big-endian.以下两个字节是魔术字节0x00 0x2A(42;)).以下四个重要字节将告诉您从TIFF标头开始到第0个IFD的偏移量.

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

图像文件目录

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

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

IFD字段

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

以下四个字节可能有点令人困惑.对于字节数组(ascii和undefined types),给出了数组的字节长度.例如,对于Ascii字符串:"Exif",计数将为5,包括空终止符.对于其他类型,这是场组件的数量(例如,4个短路,3个有效组合).

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


这基本上是如何在JPEG/Exif文件中排列元数据.需要记住一些注意事项(记得根据需要转换字节顺序,偏移是从TIFF标题的开头,跳转到数据部分以读取长字段,......)但格式很容易阅读.以下是JPEG/Exif文件的颜色编码HEX视图.蓝色块表示SOI,橙色表示TIFF标题,绿色表示IFD大小和偏移字节,浅紫色块表示IFD字段,深紫色块表示字段数据.

HEX视图的JPEG/Exif文件