JPEG
格式
0xFFD8: SOI(start of image)
0xFF**: JPEG信息数据段(Exif信息的位置
SOS:Start of stream
0xFFD9: EOI(end of image)
注
0xFFEO-0xFFEF: 应用程序标志,用在用户的应用程序中,在解码JPEG格式的图片时不是必须的。
JPEG格式采用mototota字节顺序,其中的Exif部分却可以采用这两种方式
JFIF (JPEG档案交换格式)
0xFFE0:(APP0)相机的配置数据和缩略图标志
Exif (Exchangeable Image File 使用TIFF格式来存储数据)
格式
FFD8:SIO
FFE1:APP1 MARKER
APP1 SIZE
APP1 DATA
Other Marker: ...
...
注
0xFFE1(APP1):插入数据的应用程序标志
该格式包含缩略图信息
TIFF
格式
TIFF头(TIFF格式的前8个字节)
1-2:决定采用何种字节顺序,0x4949(ll)代表intel小端字节顺序,0X4d4d(MM)代表motorola大端字节顺序
3-4:0x2A,0x00或者0x00,0x2A
5-8:第一个IFD偏移量(一般是:0x00000008)
第一个IFD(IF0):
1-2:这个IFD包含的目录实体数量
3-...:实体
3-14:第一个目录实体12个字节
3-4:标签号2个字节
5-6:数据格式2个字节【数据格式表 1-0】
7-10:组成元素的数量4个字节【计算总长度 1-1】
11-14:数据本身或者数据的偏移量
15-26:第二个目录实体12个字节
...
下一个IFD的偏移量:4个字节大小
第二个IFD:
...
0x00000000:这个偏移量出现了...
最后一个IFD
案例一:一些数码相机使用IFD数据格式来表示制造商数据【1-1】
0000:49 49 2A 00 08 00 00 00-02 00 1A 01 05 00 01 00
0010:00 00 26 00 00 00 69 87-04 00 01 00 00 00 11 02
0020:00 00 40 00 00 00 48 00-00 00 01 00 00 00
解读:
49 49: 采用intel的小端字节顺序(大多数数码相机采用这种方式) 0x0000-0x0001
2A 00: 因为前一个字节是49 49,这个字段是必选项 0x0002-0x0003
08 00 00 00: 第一个IFD(图像文件目录)的起始地址(这个地址对应下一个字节) 0x0004-0x0007
02 00: IFD0有两个字节 0x0008-0x0009
1A 01: 标签-水平分辨率标签 0x000a-0x000b
05 00: 格式-无符号分数(每个占8个字节) 0x000c-0x000d
01 00 00 00: 组成元素的数量:1.由于采用intel方式,所有想要读出16进制的数字需要按照 4 3 2 1的字节 0x000e-0x0011
顺序重新排列得 到 0x00000001 ,数据中长度大于4个字节,因此后面4个字节为偏移量
26 00 00 00: 偏移量-重新排列得到0x00000026,这个是水平分辨率的首地址 0x0012-0x0015
69 87: 标签-EXIF偏移 0x0016-0x0017
04 00: 0x0004 ,表示 数据格式-无符号长整型(四个字节) 0x0018-0x0019
01 00 00 00: 组成元素数量-1 0x001a-0x001d
11 02 00 00: Exif SubIFD偏移量实际值(0x00000211 表示 Exif SubIFD首地址) 0x001e-0x0021
40 00 00 00: 下一个IFD从0x00000040开始 0x0022-0x0025
48 00-00 00: 水平分辨率分子0x00000048,即72 0x0026-0x0029
01 00 00 00: 水平分辨率分母0x00000001,即1,因此水平分辨率为72/1 0x002a-0x002d
缩略图
JPEG缩略图(Exif2.1规范推荐格式)
IFD1
0x0103:6 压缩标签
0x0201: 偏移量标签
0x0202: 大小标签
注: IFD1中可以观察到缩略图的偏移量标签(JpegIFOffset 0x0201)及 大小标签(JpegIFByteCount 0x0202),为普通的JPEG 格式
TIFF格式
第一种情况:
IFD1
0x0103:1 压缩标签(非压缩采用TIFF格式)
0x0111: StripOffset标签 起点数据
0x0117: StripByteCount标签 缩略图大小
第二种情况:
IFD1
0x0103:1 压缩标签(非压缩采用RGB格式)
0x0106: 2
0x0111: StripOffset标签 起点数据
0x0117: StripByteCount标签 缩略图大小
第三种情况:
IFD1
0x0103:2 压缩标签(压缩采用YcbCr格式)
0x0106: 2
0x0111: StripOffset标签 起点数据
0x0117: StripByteCount标签 缩略图大小