文件中段的介绍
JPEG文件中的每一个Marker Segments都是以一个WORD类型的数值开始(注意:这个数值记录在文件中时是高位字节在前,低位字节在后,将在后面介绍这个字节顺序的问题),这个数值即所谓的Marker,每个Marker代表着相应的Segment的意义,如果这个Segment有内容(即长度大于0,是否有内容视具体Marker而定),接下来的一个WORD类型的数值就是这个Segment的长度(这个数值的字节顺序与Marker相同),至于Segment的具体内容,则根据Marker的不同有不同的定义。如FFD8这个Marker叫做SOI,表示图像的开始,这个段是没有内容的;如FFE0则是APP0,即应用程序段0,属于可自定义的数据,它已经被用于JFIF[4],这个段则是有内容的,接下来的一个WORD就是段长度,段内容的定义是由JFIF规范所定义。
EXIF也是一种扩展定义,类似于JFIF,它使用了APP1和APP2这两个Marker Segments。之所以要用两个Marker是因为如前面所说,Segment的长度是用一个WORD来表示,即最大不超过64K。因为EXIF支持一种被称为Flashpix的无损图像格式,其数据很可能超过64K,所以用了APP2,其中APP2可以有多个,不过因为对Flashpix的支持属于EXIF的扩展功能(在规范文档的附录F中说明[1]),通常很少用到,本文不作讨论。
EXIF定义的APP1段是一个标准的JPEG Marker Segment,如表1所示。其中的APP1 Marker的值为FFE1,Length为这个段的长度,其值包括Length本身所占的两个字节,但不包括Marker所占的两个字节。段中剩下的部分便是EXIF数据。
EXIF数据的格式定义也很简单,如表2所示。它包括两个部分:EXIF头和TIFF头。EXIF头由六个字节组成,其内容为一个长度为4的ASCIIZ(以NULL结尾的ASCII)字符串,加一个字节的0(用于使数据按WORD对齐),而这个ASCIIZ串内容就是“Exif”。而TIFF头则是采用了标准的TIFF文件格式的定义(TIFF同样是一种定义灵活的文件格式,在某种程度上说是太灵活了),这样可以让JPEG和TIFF两种格式中的EXIF信息可以以一致的方法进行处理。
起始
长度(Bytes)
内容
0x00
2
APP1 Marker(0xFFE1)
0x02
2
Length
0x04
Length - 2
EXIF Data
表1:APP1段格式定义
起始
长度(Bytes)
内容
0x00
6
EXIF Header
0x06
APP1 Length - 8
TIFF Header
表2:EXIF格式定义
起始
长度(Bytes)
内容
0x00
2
Byte order
0x02
2
Flag(0x2A)
0x04
4
The offset of the first IFD
表3:TIFF Image File Header格式定义
TIFF Header[2]包括两个部分:Image File Header和IFD(Image File Directory)链表。其中Image File Header的定义如表3所示。其中Byte order用于说明此TIFF文件所采用的字节顺序,用两个字符表示,有两种选择,分别是:II和MM(这个MM跟美眉无关J),其中II是指采用Intel字节顺序,而MM是指采用Motolora字节顺序(见下面的说明)。Flag是TIFF文件格式的标志,总是为0x002A,即十进制数42。最后一个DWORD是指向第一个IFD的起始位置,其偏移量的计算起点是TIFF Header的起点,即如果第一个IFD是紧接着Image File Header的话,这一项的值就为8(Image File Header的大小)。
图1:IFD链表结构
IFD是一个链表结构,如图1所示,在每个IFD的末尾包含一个指向下一个IFD的偏移量(同样是从TIFF Header算起),如果这个偏移量为0,则表示已经到了链表的末尾。EXIF只使用了两个TIFF IFD,分别被称作IFD0和IFD1,但定义了三个自己的IFD:EXIF IFD, GPS IFD, Interoperability IFD,它们的结构与标准TIFF IFD相同,但不是记录于TIFF的IFD链表中,而是作为IFD0的扩展记录的。
下面是一个典型的EXIF JPEG文件格式分析结果(源文件为一张用Nikon CoolPixel 775相机拍摄的照片,所用的EXIF版本是2.1,与2.2版差别不大):
JPEG SOI : FF D8 // 图片起始
JPEG APP1: FF E1
APP1 Size : 1C 45 // 注意:前面这三个WORD都是big endian的
EXIF Flag : 'Exif', 0, 0
TIFF Header:
Byte Order: 'II'
Flag : 2A 00
IFD0 offset : 08 00 00 00
Entries Count : 0B 00 // 11
IFD Entry :
Tag : 0E 01 // Image Description 图像说明
Type : 02 00 // ASCII
Size : 0B 00 00 00
Value : 92 00 00 00 // from TIFF Header
IFD Entry:
Tag : 0F 01 // Make 制造
Type : 02 00
Size : 06 00 00 00
Value: B2 00 00 00
IFD Entry:
Tag : 10 01 // Model 型号
Type : 02 00
Size : 05 00 00 00
Value: CA 00 00 00
…
IFD Entry:
Tag : 69 87 // EXIF IFD
Type : 04 00 // LONG
Size : 01 00 00 00
Value: 1C 01 00 00 // Offset of EXIF IFD
END of IFD0
IFD1 Offset : 18 03 00 00
... // 存放IFD的Value数据
EXIF IFD :
Entries Count : 18 00
IFD Entry :
Tag : 9A 82 // Exposure time
...
END of EXIF IFD
Next IFD : 00 00 00 00 // 按标准IFD链表约定,表示没有后继IFD
... // 存放EXIF IFD的Value数据
IFD1 : // EXIF中用于存放缩略图
Entries Count : 06 00
IFD Entry :
Tag : 03 01
...
END of IFD1
Next IFD : 00 00 00 00 // EXIF只用到两个TIFF IFD
... // Thumbnail etc.
// end of TIFF header
// 其它JPEG Marker segments
JPEG EOI : FF D9 // 图片结束
所有的JPEG文件以字符串“0xFFD8”开头,并以字符串“0xFFD9”结束。文件头中有一系列“0xFF??”格式的字符串,称为“标识”,用来标记JPEG文件的信息段。“0xFFD8”表示图像信息开始,“0xFFD9”表示图像信息结束,这两个标识后面没有信息,而其它标识紧跟一些信息字符。
0xFFE0 -- 0xFFEF之间的标识符称为“应用标记”,没有被常规JPEG文件利用,Exif正是利用这些信息串记录拍摄信息如快门速度、光圈值等,甚至可以包括全球定位信息。按照Exif2.1标准对这些标识符的定义,数码相机可以把各种拍摄信息记入数码图像中,应用软件可以读取这些数据,再按照Exif2.1标准,检索出它们的具体含义,一般而言包括以下一些信息:
Image Description 图像描述、来源. 指生成图像的工具
Artist作者有些相机可以输入使用者的名字
Make 生产者指产品生产厂家
Model 型号指设备型号
Orientation方向有的相机支持,有的不支持
XResolution/YResolution X/Y方向分辨率本栏目已有专门条目解释此问题。
ResolutionUnit分辨率单位一般为PPI
Software软件显示固件Firmware版本
DateTime日期和时间
YCbCrPositioning 色相定位
ExifOffsetExif信息位置,定义Exif在信息在文件中的写入,有些软件不显示。
ExposureTime 曝光时间即快门速度
FNumber光圈系数
ExposureProgram曝光程序指程序式自动曝光的设置,各相机不同,可能是Sutter Priority(快门优先)、Aperture Priority(快门优先)等等。
ISO speed ratings感光度
ExifVersionExif版本
DateTimeOriginal创建时间
DateTimeDigitized数字化时间
ComponentsConfiguration图像构造(多指色彩组合方案)
CompressedBitsPerPixel(BPP)压缩时每像素色彩位指压缩程度
ExposureBiasValue曝光补偿。
MaxApertureValue最大光圈
MeteringMode测光方式,平均式测光、中央重点测光、点测光等。
Lightsource光源指白平衡设置
Flash是否使用闪光灯。
FocalLength焦距,一般显示镜头物理焦距,有些软件可以定义一个系数,从而显示相当于35mm相机的焦距 MakerNote(User Comment)作者标记、说明、记录
FlashPixVersionFlashPix版本(个别机型支持)
ColorSpace色域、色彩空间
ExifImageWidth(Pixel X Dimension)图像宽度指横向像素数
ExifImageLength(Pixel Y Dimension)图像高度指纵向像素数
Interoperability IFD通用性扩展项定义指针和TIFF文件相关,具体含义不详
FileSource源文件 Compression压缩比。
范例
举个直观的例子:
项目 | 资讯 |
制造厂商 | Canon |
相机型号 | Canon EOS-1D Mark II |
影像方向 | 正常(upper-left) |
影像分辨率 X | 72 |
影像分辨率 Y | 72 |
分辨率单位 | dpi |
Software | Adobe Photoshop CS Macintosh |
最后异动时间 | 2005:10:06 12:53:19 |
YCbCrPositioning | 2 |
曝光时间 | 0.00800 (1/125) sec |
光圈值 | F1.6 |
拍摄模式 | 光圈优先 |
ISO 感光值 | 100 |
EXIF 资讯版本 | 30,32,32,31 |
影像拍摄时间 | 2005:09:25 15:00:18 |
影像存入时间 | 2005:09:25 15:00:18 |
曝光补偿(EV+-) | 0 |
测光模式 | 点测光 (Spot) |
闪光灯 | 关闭 |
镜头实体焦长 | 85 mm |
Flashpix 版本 | 30,31,30,30 |
影像色域空间 | sRGB |
影像尺寸 X | 800 pixel |
影像尺寸 Y | 533 pixel |