问候,
我想使用Android获取一些图像的Exif信息。我知道有一些标准的Java库可以在设备上使用,我肯定最终会使用其中一个。
但同时,有人能解释一下这些信息是如何编码在JPG文件内部的吗?通常从文档中哪里/如何获取此信息?当我用文本编辑器打开文档时,它全部都是二进制的。
想了解它的工作原理以及如何读取相关数据。
问候,
我想使用Android获取一些图像的Exif信息。我知道有一些标准的Java库可以在设备上使用,我肯定最终会使用其中一个。
但同时,有人能解释一下这些信息是如何编码在JPG文件内部的吗?通常从文档中哪里/如何获取此信息?当我用文本编辑器打开文档时,它全部都是二进制的。
想了解它的工作原理以及如何读取相关数据。
Exif建立在TIFF(标记图像文件格式)之上。因此,我们首先必须检查TIFF:
将结构视为树状结构,叶子节点包含原始值。TIFF对其结构进行了自我描述,但它并没有规定叶子节点实际上代表什么意义。
事实上,您可以在TIFF中存储任何类型的数据,它不与图像耦合。
TIFF文件具有通用标头:
MM
或II
。这告诉你如何考虑未来的所有字节--是LSB(最低有效位)还是MSB(最高有效位)优先。0x002A
IFD具有同样简单的结构:
标签在12个字节中有简单的表示:
数据类型是预定义的。例如:1表示8位无符号整数,12表示64位浮点数。
因此,您可以继续跟随数据文件。一些观察结果:
0x1234
的标记具有4个整数:{1,2,3,4}
要将TIFF解码为Exif,您需要应用定义每个IFD表示的字典以及这些IFD中每个标记ID表示的内容。
APP1 (数字值 0xe1 )段中找到。一旦您拥有它,您必须跳过一些前导字节( Exif \ 0 \ 0 ),然后才能看到表示TIFF格式的Exif数据开始的 MM 或 II 。
通过示例将所有内容整合在一起
这是我的库的样本图像之一的二进制转储:
![](https://i.imgur.com/2RWT3.png)
按顺序:
JPEG起始
FF D8
是JPEG的“魔数”。
FF
标记了JPEG段的开始。
E1
表示JPEG段类型(这是APP1
,Exif存储在其中)。
18 B3
(6,323十进制)给出了段的长度(包括大小字节),因此我们知道该JPG文件的所有Exif数据将位于接下来的6,321个字节内。请注意,在JPG中,多字节值使用Motorolla排序进行编码,尽管嵌套的Exif数据可能使用Intel排序。
45 78 69 66 00 00
或以ASCII形式表示为Exif\0\0
是Exif前导。 APP1
不仅专门用于Exif,因此可以区分它们。
TIFF / Exif起始
4D 4D
或MM
表示这个Exif块采用Motorolla字节顺序
00 2A
是我们的标准TIFF标记,如上所述
00 00 00 08
是相对于TIFF头部(MM
在本例中)的第一个IFD的偏移量(8个字节)。这直接指向该序列中的下一个字节,尽管不一定需要。
IFD开始
00 08
打开我们的第一个IFD,并告诉我们将有8个标签出现
标签开始
01 0F
是第一个IFD中第一个标签的ID,这里是相机制造商
00 02
是值的类型(2表示ASCII字符串)
00 00 00 16
是组件数,意味着我们将有一个22字节的字符串
00 00 01 B2
(434十进制)是指向该字符串位置的指针,相对于TIFF头(MM
)。在此截图中看不到它,但它指向的是45 41 53 54 4D 41 4E 20 4B 4F 44 41 4B 20 43 4F 4D 50 41 4E 59 00
,即ASCII中的EASTMAN KODAK COMPANY
RAW
相机的原始文件(CR2/NEF/ORW等)通常使用TIFF格式,但是它们使用与Exif不同的标签。这些文件中的第二对字节也将与00 2A
不同,表示应该应用的TIFF字典类型。
49 49
表示II
,表示Intel,小端序--这意味着2字节数字在文件中具有低字节优先)。II
字节顺序中,请反转字节以读取长度。2 bytes: Tag ID
2 bytes: Tag Type
4 bytes: Length
4 bytes: data if the data is 4 bytes or less, or an offset to the data
在N个12字节记录之后,您将拥有以上N个记录中使用的每个偏移量指向的数据。 您需要查找ID和类型以了解它们的含义及其表示方式。
解析EXIF数据相当繁琐,但你可以找到许多用于解析的库。我最喜欢的Java库是,
http://www.java2s.com/Open-Source/Java-Document/Web-Server/Jigsaw/org/w3c/tools/jpeg/Exif.java.htm
这是Java和EXIF的好库之一:http://www.drewnoakes.com/code/exif/