手机开发实战161——EXIF格式介绍2

来源:互联网 发布:车子天窗有必要吗 知乎 编辑:程序博客网 时间:2024/05/24 06:37

文件中段的介绍

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,它使用了APP1APP2这两个Marker Segments。之所以要用两个Marker是因为如前面所说,Segment的长度是用一个WORD来表示,即最大不超过64K。因为EXIF支持一种被称为Flashpix的无损图像格式,其数据很可能超过64K,所以用了APP2,其中APP2可以有多个,不过因为对Flashpix的支持属于EXIF的扩展功能(在规范文档的附录F中说明[1]),通常很少用到,本文不作讨论。

EXIF定义的APP1段是一个标准的JPEG Marker Segment,如表1所示。其中的APP1 Marker的值为FFE1Length为这个段的长度,其值包括Length本身所占的两个字节,但不包括Marker所占的两个字节。段中剩下的部分便是EXIF数据。

EXIF数据的格式定义也很简单,如表2所示。它包括两个部分:EXIF头和TIFF头。EXIF头由六个字节组成,其内容为一个长度为4ASCIIZ(以NULL结尾的ASCII)字符串,加一个字节的0(用于使数据按WORD对齐),而这个ASCIIZ串内容就是“Exif”。而TIFF头则是采用了标准的TIFF文件格式的定义(TIFF同样是一种定义灵活的文件格式,在某种程度上说是太灵活了),这样可以让JPEGTIFF两种格式中的EXIF信息可以以一致的方法进行处理。

 

起始
 
长度(Bytes)
 
内容
 
0x00
 2
 APP1 Marker(0xFFE1)
 
0x02
 2
 Length
 
0x04
 Length - 2
 EXIF Data
 

1APP1段格式定义

 

起始
 
长度(Bytes)
 
内容
 
0x00
 6
 EXIF Header
 
0x06
 APP1 Length - 8
 TIFF Header
 

2EXIF格式定义

 

起始
 
长度(Bytes)
 
内容
 
0x00
 2
 Byte order
 
0x02
 2
 Flag(0x2A)
 
0x04
 4
 The offset of the first IFD
 

3TIFF Image File Header格式定义

 

TIFF Header[2]包括两个部分:Image File HeaderIFDImage File Directory)链表。其中Image File Header的定义如表3所示。其中Byte order用于说明此TIFF文件所采用的字节顺序,用两个字符表示,有两种选择,分别是:IIMM(这个MM跟美眉无关J),其中II是指采用Intel字节顺序,而MM是指采用Motolora字节顺序(见下面的说明)。FlagTIFF文件格式的标志,总是为0x002A,即十进制数42。最后一个DWORD是指向第一个IFD的起始位置,其偏移量的计算起点是TIFF Header的起点,即如果第一个IFD是紧接着Image File Header的话,这一项的值就为8Image File Header的大小)。

 

 

 


1IFD链表结构

 

IFD是一个链表结构,如图1所示,在每个IFD的末尾包含一个指向下一个IFD的偏移量(同样是从TIFF Header算起),如果这个偏移量为0,则表示已经到了链表的末尾。EXIF只使用了两个TIFF IFD,分别被称作IFD0IFD1,但定义了三个自己的IFDEXIF IFD, GPS IFD, Interoperability IFD,它们的结构与标准TIFF IFD相同,但不是记录于TIFFIFD链表中,而是作为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

    ...  //  存放IFDValue数据

    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 IFDValue数据

    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

0 0
原创粉丝点击