16boke - 一路博客

JPEG文件格式介绍

SOI 图像开始
标记代码 2字节            固定值0xFFD8
 
APP0  应用程序保留标记0
标记代码 2字节           固定值0xFFE0
包含6个具体字段:
1数据长度  2字节1~6个字段的总长度(不包括标记代码,包括本字段)
2标识符    5字节固定值0x4A46494600,即字符串”JFIF0”
3版本号    2字节  一般是0x0102,表示JFIF的版本号1.2 可能会有其他数值代表其他版本
4X和Y的密度单位 1字节只有三个值可选 0:无单位 1:点数/英寸 2:点数/厘米
5X方向像素密度   2字节取值范围未知
6Y方向像素密度   2字节取值范围未知
APP1
标记代码  2字节固定值0xFFE1
包含2个具体字段:
1数据长度 2字节          1~22个字段的总长度(不包括标记代码,包括本字段)
2详细信息数据长度-2字节  内容不定
详细信息 EXIF头 6字节固定值 45 78 69 66 00 00
TIFF头 8字节通常为49 49 2A 00 08 00 00 00或77 77 00 2A 00 00 00 08
 
TIFF头的结构
TIFF格式中前8个字节是 TIFF 头. 其中最开始的前2个字节定义了 TIFF 数据的字节序. 如果这个值是 0x4949="II"的话, 就表示按照 "Intel" 的字节序(Little Endian) 来排列数据. 如果是 0x4d4d="MM", 则说明按照 "Motorola" 的字节序(Big Endian)来排列数据. 例如, 这个值是'305,419,896' (注意:16进制值为0x12345678). 在 Motorola 的字节序中, 数据存储时的排列顺序为 0x12,0x34,0x56,0x78. 而用 Intel 的字节序的话, 它就是按照 0x78,0x56,0x34,0x12 来排序数据. 几乎所有的数字相机都是使用 Intel 的字节序. 不过 Ricoh 使用的是 Motorola的. Sony 使用的是Intel 字节序(除了D700). Kodak 的DC200/210/240 使用的是 Motorola 字节序, 但是 DC220/260 使用的是 Intel的, 尽管它们都是使用在 PowerPC的平台上! 因此当我们需要使用 Exif 数据的值的时候, 我们必须每次都要检查它的字节序. 尽管 JPEG 数据仅仅是使用 Motorola 字节序, 但 Exif 却是允许这两种字节序存在的.
随后的两个字节是一个2字节长度的固定值 0x002A. 如果数据使用 Intel 字节序, 则这两个字节的数据排列为 "0x2a,0x00". 如果是 Motorola 的, 则是 "0x00,0x2a". TIFF头的最后的 4个字节是到第一个 IFD(图像文件目录/Image File Directory, 将在下一节中描述)的偏移量. 这个偏移量是指从TIFF头("II" 或者 "MM")开始, 包含自己偏移量值的本身, 到下一个IFD为止的长度的字节数. 通常地第一个 IFD 是紧挨着 TIFF 头出现的, 因此这个偏移量的值是 '0x00000008'.
TIFF格式

目录项中标签:
0x103    6为JPG 1为TIFF
0x0201   JPG缩略图偏移量
0x0202   JPG缩略图大小
 
缩略图
Exif格式中包含缩略图像(除了Ricoh RDC-300Z). 通常它被放到IFD1的后面. 缩略图有 3 种格式; JPEG 格式(JPEG 使用YCbCr), RGB TIFF 格式, YCbCr TIFF 格式. 在Exif2.1之后推荐使用JPEG 格式和160x120像素的尺寸. 根据 DCF 规格, 缩略图像必须 使用JPEG 格式以及图像的尺寸固定为160x120 像素.

JPEG格式的缩略图
IFD1中的标签Compression(0x0103)如果是 '6', 则缩略图就是JPEG格式. 几乎所有的 Exif图像中缩略图都使用JPEG 格式. 在这种情况下, 你能从IFD1的JpegIFOffset(0x0201) 标签中得到缩略图的偏移量, 从标签JpegIFByteCount(0x0202)中得到缩略图的大小. 数据格式则是普通的 JPEG 格式, 也就是从0xFFD8处开始在0xFFD9处结束.

TIFF格式的缩略图
IFD1的标签Compression(0x0103)如果是 '1', 则缩略图的格式就没有经过压缩的 (就是TIFF 图像). 缩略图数据的开始点是标签 StripOffset(0x0111) , 缩略图的尺寸就是标签 StripByteCounts(0x0117) 之和.

JPEG