图像JPEG&EXIF格式介绍(一)

1、Jpeg介绍

JPEG(Joint Photographic Experts Group)是JPEG标准的产物,该标准由国际标准化组织(ISO)制订,是面向连续色调静止图像的一种压缩标准。 JPEG格式是最常用的图像文件格式,后缀名为.jpg或.jpeg。

        jpeg标准(ISO/IEC 10918)是在1992年被创建,尽管这个标准通常被作为是一个单一规范,事实上是由4个独立部分和一个编码模式的组合组成。第一部分(ISO/IEC 10918-1 | ITU-T Recommendation T.81)指定核心的编码技术,包含了用于编码图像的许多选项;第二部分定义规范测试;第三部分对第一部分的编码技术进行了一套扩展,通过修改引入了SPIFF文件格式;第四部分聚集于JPEG1 profiles,SPIFF profiles, SPIFF tags, SPIFF颜色空间,SPIFF压缩类型的注册,并定义注册机构;最后第五部分指定JPEG文件交换格式(JFIF JPEG File Interchange Format)。

2、Jpeg格式介绍

        基本上,Exif文件格式是与JPEG文件格式一样的,Exif嵌入一些图像/数码信息数据和JPEG的thumbnail图像以符合JPEG规范。因此你可以通过符合JPEG标准的互联网浏览器/图片查看器/照片修饰软件等查看Exif格式的图像文件,就跟查看JPEG图像文件一样。

        JPEG文件以二进制值“0xFFD8”开始,“0xFFD9”结束,在JPEG数据里还有一些二进制“0xFFXX”数据,他们被称为标记“Marker”,它意思是一段JPEG信息数据,0xFFD8意是图像开始SOI(Start of image),0xFFD9是图像结束EOI(End of image)。这两个特殊的标记Marker后面不跟有数据,而其他的Markers则有数据,Marker基本的格式如下:

0xFF+Marker Number(1 byte)+Data size(2 bytes)+Data(n bytes)

        Data size(2 bytes)字段是“Motorola”字节对齐,更大数字开始。注意:“Data”字段包含“Data size”字段描述符,举例来说,如果有以下的Marker

FF C1 00 0C

        这意味着Marker(0xFFC1)有0x000C(即12)字节大小的数据,但这个数据大小12包含2个字节的“Data size”字段描述符,后面再跟着10字节大小的数据。在JPEG格式中,一些Markers描述数据,然后放置SOS(Start of stream)Marker,在SOS Marker之后就是JPEG 图像流,最后以EOI Marker结束。

SOI Marker Marker XX size=SSSS Marker YY size=TTTT SOS Marker size=UUUU Image stream EOI Marker
FFD8 FFXX SSSS DDDD...... FFYY TTTT DDDD...... FFDA UUUU DDDD.... I I I I.... FFD9

2.1、Exif使用的Marker

        0xFFE0~0xFFEF marker字段被命名为“Application Marker”,应用Marker字段,对于解码JPEG图像不是必须的。这些Marker字段被用户app使用,例如像olympus/canon/casio/agfa数码相机使用JFIF(JPEG File Interchange Format)来存储图像,JFIF使用APP0(0xFFE0) Marker字段来嵌入数码配置数据和thumbnail图像。

        Exif同样使用应用Marker字段来嵌入数据,但Exif使用APP1(0xFFE1)Marker字段来避免与JFIF格式冲突,每个Exif文件格式都是以下面的格式开始:

SOI Marker APP1 Marker APP1 Data Other Marker
FFD8 FFE1 SSSS 457869660000 TTTT...... FFXX SSSS DDDD......

        Exif以SOI(0xFFD8)Marker字段开始,因此它也是一个JPEG文件,然后紧接着是APP1 Marker字段,所有的Exif数据都存储在APP1字段数据区域,“SSSS”部分意思是APP1数据区域(Exif数据区域)的数据大小,另外要注意,这个数据大小“SSSS”包含了其自身描述符的大小,在“SSSS”之后就是APP1数据,不过需要注意的是开始的部分是一个特定数据,用来识别是不是Exif,Exif的ASCII码和2个字节的0x00被使用,也即是说若是Exif的话,其特定数据是一个固定值“457869660000”。在APP1 Marker区域之后是其他JPEG Marker字段。

图像JPEG&EXIF格式介绍(一)_第1张图片

 2.2、Exif数据结构

大致上Exif数据(APP1)的结构如下,下面是一个以“Intel”字节对齐包含JPEG格式thumbnail的例子,正如上面所说,Exif数据是以“Exif”ASCII码和2个字节的0x00开始,然后就是Exif数据,Exif使用TIFF格式来存储数据

FFE1 APP1 Marker
SSSS APP1 Data APP1 Data Size
45786966 0000 Exif Header
49492A00 08000000 TIFF Header
XXXX. . . . IFD0 (main image) Directory
LLLLLLLL Link to IFD1
XXXX. . . . Data area of IFD0
XXXX. . . . Exif SubIFD Directory
00000000 End of Link
XXXX. . . . Data area of Exif SubIFD
XXXX. . . . IFD1(thumbnail image) Directory
00000000 End of Link
XXXX. . . . Data area of IFD1
FFD8XXXX. . . XXXXFFD9 Thumbnail image

        我们来看下TIFF头结构,TIFF格式的头8个字节是TIFF头,其中头2个字节定义TIFF数据的字节对齐,如果是0x4949="II"则是“Intel”字节对齐;如果是0x4d4d=“MM”则是“Motorola”字节对齐。举个例子来说,值'305,419,896' 被标记为十六进制系统0x12345678,在Motrola字节对齐是以0x12,0x34,0x56,0x78来存储,在Intel字节对齐则是0x78,0x56,0x34,0x12。大部分数码相机是使用Intel字节对齐,但也有使用Motorla的,因此在需要使用Exif数据时,我们必须每次都要核查字节对齐。尽管JPEG数据是仅使用Motorola字节对齐,但Exif是两种对齐方式都允许。紧接着的2字节是固定的2字节长度的0x002A,如果数据是使用Intel对齐则应是“0x2A00”,如果是Motorola对齐则应是“0x002A”。TIFF头的最后4字节是首个IFD(Image File Directory)的偏移量,TIFF格式里使用的偏移量都是从TIFF头(“II”或“MM”)的开头来开始计算。不过通常第一个IFD总是紧挨着TIFF头,因此这个偏移量是值“0x00000008”。

下面是一个实际图片解析出来的信息情况,是以Intel字节对齐,APP1字段数据大小为47079

图像JPEG&EXIF格式介绍(一)_第2张图片

 2.3、IFD:Image file directory图像文件路径图像JPEG&EXIF格式介绍(一)_第3张图片

         紧临TIFF头的是IFD,它包含了图像信息数据,从上面可看出WORD nDirEntry代表着这个IFD里的路径项的个数,每个路径项大小是12字节。在最后一个路径项后面是一个4字节大小的数据,DWORD nextIFDoffset意思是下一个IFD的偏移量,注意这个偏移量是从TIFF头开始计算,如上面所示为1257大小,而TIFF头的开始地址是0x0C,因此相加后的下一个IFD的地址是0x0c+1257+1=0x045F,即是struct IFD ifdThumbnailImage的地址。而在DWORD nextIFDoffset后面的是IFD的数据区域,可以看出是记录着其他信息,如拍照时间等等。

你可能感兴趣的:(图像,图像处理)