关于EXIF格式的分析
JPEG格式和标志
JPEG文件都是以十六进制的 0xFFD8 开始,以 0xFFD9 结束。在JPEG数据中,0xFF** 这样的数据被用作标志,表示JPEG信息数据段。0xFFD8表示SOI(Start Of Image 图像的开始),以0xFFD9 表示EOI(End of Image 图像结束)。这两个特殊的标志没有附加的数据,而其他标志都在标志后面带有附加的数据。
0xFF + 标志数字(1字节) + 数据大小(2字节) + 数据(n字节)
数据大小(2字节) : 是大端顺序表示,从高字节开始。
0xFFC1 00 0C
表示标志 0xFFC1 有0x000C(12)个字节数据,但是数据的大小"12"也包含了记录数据大小的字节,所以在0x000C后面只有10个字节的数据量。
在JPEG格式中,一些标志描述数据后,跟着的是SOS(Start Of Stream 数据流开始) 标志。在SOS标志后,就是JPEG图像流,知道EOI标志终结。格式如下所示:

Exif中使用的标志
从0xFFE0 ~ 0xFFEF 的标志是“应用程序标志”,在解码JPEG图像的时候不是必须使用的。这些标志被用在用户应用中。
Exif也使用应用程序标志来插入数据,但是Exif使用APP1(0xFFE1)标志以避免和JFIF格式冲突。
JFIF是JPEG档案交换格式,数码相机会用这个格式来存储照片。每个EXIF格式都是从下面格式开始的:

从SOI(0xFFD8) 标志开始,因此是一个JPEG文件。后面跟着一个APP1标志。所有的Exif数据都储存在APP1数据区中。
上面的SSSS 部分表示APP1 数据大小,这个大小是包括SSSS本身的。
APP1 数据从 SSSS 后开始,第一部分是特殊数据,使用ASCII字符"Exif"和两个字节的0x00,它定义了是否使用Exif。
在APP1标志数据之后,是其他JPEG标志。
Exif数据结构采用的是Intel 的小端字节顺序方案,且包含JPEG格式的缩略图。总体上,Exif数据是从ASCII字符Exif和2个字节0x00开始,后面就是Exif的数据了。
Exif 使用TIFF格式来存储数据,TIFF 格式请参考官方文档:
https://partners.adobe.com/asn/developer/PDFS/TN/TIFF6.pdf
如果不是adobe的partner,应该打不开上面的网址。不过本人已经备份了一份tiff6 的pdf文档在github,地址如下:
https://github.com/CainKernel/tiff6.git
下面我们介绍一下TIFF格式。
TIFF数据格式
TIFF数据格式是一种3级体系结构,从高到低一次为 文件头IFH(Image File Header),一个或多个IFD(Image File Directory)的包含标记指针的目录和数据,一个文件中可以包含多个IFD,每个IFD对应一个图像。
+------------------------------------------------------------------------------+
| TIFF Structure |
| IFH |
| +------------------+ |
| | II/MM | |
| +------------------+ |
| | 42 | IFD |
| +------------------+ +------------------+ |
| | Next IFD Address |--->| IFD Entry Num | |
| +------------------+ +------------------+ |
| | IFD Entry 1 | |
| +------------------+ |
| | IFD Entry 2 | |
| +------------------+ |
| | | IFD |
| +------------------+ +------------------+ |
| IFD Entry | Next IFD Address |--->| IFD Entry Num | |
| +--------