JPEG文件格式 JFIF & Exif

来源:互联网 发布:行政单位oa软件 编辑:程序博客网 时间:2024/06/05 17:56

JPEG是Joint Photographic Experts Group 的缩写,正是这个专家组制定了JPEG标准以及其他静态图片编解码标准。Joint(联合)是指ISO TC97 WG8(计算机与信息处理技术委员会 第8工作组)和CCITT SGVIII两个工作组的联合. 这个专家组在1992年颁布了第一个JPEG标准, ITU在1992年命名为ITU-T Recommendation T.81,  ISO/IEC在1994年命名为10918-1


注意JPEG标准仅仅说明定义了codec部分, 也就是图片如何压缩为字节流以及重新解码为图片的过程. 标准没有涉及到文件的存储格式. 


JPEG标准的附录B定义了文件格式"JPEG Interchage Format"(JIF), 不过这个文件格式很少被用到, 主要是因为Encoders和Decoders完整实现JIF很困难, 此外这个标准还缺少以下几个方面:

  • Color space定义
  • Component sub-sampling 限制
  • 像素宽高比

因此其他的JPEG文件格式标准陆续出现了.1992年颁布了JPEG File Interchange Format(JFIF),紧接着出现了Exchange image file format(Exif)和ICC color profiles. 这些格式都符合JIF的字节layout,但是又增加了一些不同的markers.在某种程度上说,JFIF是JIF标准的精简版本.

Exif JPEG文件格式主要用在摄像设备上,摄像产业把Exif作为行业的元数据交换格式.由于Exif标准不支持color profiles,所以大部分软件图像编辑软件使用JFIF格式存储JPEG码流.

不论是Exif还是JFIF格式,都遵守JPEG interchange format(JIF),他们都是由JPEG marker和compressed data组成的.下面列出了JPEG的所有marker

表1 JPEG 的marker定义

短名字节码Payload名称CommentsSOI0xFF, 0xD8NoneStart Of Image SOF00xFF, 0xC0Variable sizeStart Of Frame 0Baseline DCT-based JPEG, and specifies the width, height, number of componentsSOF20xFF, 0xC2Variable sizeStart of Frame 2Progressive DCT-based JPEGDHT0xFF, 0xC4variable sizeDefine Huffman Table(s)Specifies one or more Huffman tablesDQT0xFF, 0xDBvariable sizeDefine Quantization Table(s)Specifies one or more quantization tablesDRI0xFF, 0xDD2 bytesDefine Restart IntervalSpecifies the interval between RSTn markers, in macroblocks.This marker is followed by two bytes indicating the fixed sizeSOS0xFF, 0xDAvariable sizeStart of ScanStart of ScanRSTn0xFF, 0xDnNoneRestartInsert every r macroblocks. where r is the restart interval set by a DRI marker.APPn0xFF, 0xEnvariable sizeApplication-sepcificAn Exif JPEG file uses an APP1 marker to store metadata; JFIF JPEG file uses an APP0 marker to store JFIF metadataCOM0xFF, 0xFEvariableCommentContains a text commentEOI0xFF, 0xD9noneEnd of Image 


表2 JPEG Start of Frame marker结构

字段名称长度Comments标记代码2 bytes固定值0xFFC0数据长度2 bytesSOF marker长度,包括长度自身但不包含标记代码精度1 bytes每个样本数据的位数,通常是8位,一般软件都不支持12位和16位图像高度2 bytes图像高度,单位:像素图像宽度2 bytes图像宽度,单位:像素颜色分量数1 bytes灰度级1,YCbCr或YIQ 3,CMYK 4颜色分量信息颜色分量数x3每个颜色分量:1byte分量ID;1 byte水平垂直采样因子;1 byte 当前分量使用的量化表ID

表3 JPEG  Start of Scan

字段名成长度Comments标记代码2 bytes固定值0xFFDA数据长度2 bytesSOS marker长度,包括长度自身颜色分量数1 bytes灰度级1, YCbCr或者YIQ 3,  CMDK 4颜色分量信息颜色分量数x3每个样色分量:1 byte 颜色分量ID;1 byte直流/交流系数表号压缩图像数据3bytes  1 byte谱选择开始 固定为0x00 1 byte谱选择结束 固定为0x3f 1 byte谱选择 在basic JPEG中总为00

表4 JEPG APP0 应用程序保留标记0

 字段名称
字段长度
 Comments
标记代码 marker2 bytes固定值0xFF, 0xE0数据长度 length2 bytesAPP0总长度,不过括marker,但是包括length标识符 identifier5 bytes固定的字符串"JFIF\0"版本号 version2 bytes一般为0x0101或者0x0102像素单位 unit1 bytes坐标单位,0没有单位; 1 pixel/inch;2 pixel/cm水平像素数目 Xdensity2 bytes 垂直像素数目 YDensity2 bytes 缩略图水平像素数目1 byte 缩略图垂直像素数目1 byte 缩略图RGB位图3n bytesn = Xthumbnail * Ythumbnail, 这是一个24bits/piexl的RGB位图

表5 APPn 应用程序保留标记

字段名称
字段长度
Comments标记代码 marker2 bytes固定值0xFFE1 ~ 0xFFEF, n=1~15数据长度 length2 bytesAPPn的总长度,不包括marker的2bytes详细信息(length - 2) bytes内容是应用特定的,比如Exif使用APP1来存放图片的metadata,Adobe Photoshop用APP1和APP13两个标记段分别存储了一副图像的副本。

表6 DQT Define Quantization Table

字段名称子字段
字段长度Comments标记代码 marker 2 bytes固定值0xFF, 0xDB量化表长度 length 2 bytesDQT的总长度,不包括marker的2bytes量化表 (length-2)bytes  精度及量化表ID1 bytes高4位:精度,只有两个可选值,0 8bits,1 16bits;
低4位:量化表ID,取值范围为0~3 表项64*(精度+1) bytes 

EOI marker

End of Image, 图像结束marker,一般来说EOI在JPEG文件的末尾处,但是有的JPEG会在EOI之后添加一些内容。


0xFF在JPEG文件中具有标记性的含义,后一个字节则根据不同意义有不同数值,在每个标记码之前还可以添加书目不限的无意义的0xFF填充,也就是说连续的多个0xFF可以理解为一个0xFF,并表示一个标记码的开始。

注意由于compressed data(jpeg压缩数据流)中可能出现0xFF的,为了和marker区分开,就需要特殊处理。具体的做法是在0xFF后添加一个没有意义的0x00。如果在图像数据流中遇到0xFF,检测紧接着的字符,处理规则如下:

1) 0x00,则表示0xFF是图像流的组成部分。

2) 0xD9,则与0xFF共同组成EOI标记,图像流结束,同时图像文件结束。

3) 0xD0~0xD7,则组成RSTn标记,则要忽视真个RSTn标记,即不对当强的0xFF和紧接着的0xDn两个字节进行译码,并按照RST标记的规则调整译码变量。

4) 0xFF,忽视当前的0xFF,对后一个0xFF在做判断

5) 其他数值,则忽视当前的0xFF,并把紧接着的数值用于译码


JFIF - JPEG FILE Interchange Format

JFIF是为了使得JPEG 码流能够在广泛的平台和应用见进行交换的最小文件格式.这个最小文件格式不包括TIFF JPEG标准任何高级特性,以及任何应用特定的文件格式.这种简化格式的初衷就是为了方便JPEG压缩图像的交换.

JFIF语法符合ISO DIS 10918-1附录B中关于交换文件语法的定义.此外,JFIF 使用APP0 marker来实现JFIF特定于JIF的部分

JFIF格式文件的 layout:

[cpp] view plain copy
  1. 0xFF, 0xD8                  SOI, Start of Image  
  2. 0xFF, 0xE0                  APP0, length, identifies, version, units, Xdensity, YDensity, Xthumbnail, Ythunbnail, (RGB)n  
  3.       length                2 bytes: 这个APP0域的长度,包括长度字段本身的2 bytes,但是不包括APP0 marker自身  
  4.      identifier            5 bytes: 0x4A, 0x46, 0x49, 0x46, 0x00. 字符串"JFIF"   
  5.       version               2 bytes: 版本号,一般为0x0102 或者0x0101,也就是1.01或者1.02  
  6.       units                 1 bytes: 坐标的单位,units=0: 没有单位;units=1: 每英寸一个点;units=2 每厘米一个点  
  7.      Xdensity              2 bytes: 水平像素数  
  8.       Ydensity              2 bytes: 垂直像素数  
  9.       Xthumbnail            1 bytes: Thumbnail水平像素数  
  10.       Ythumbnail            1 bytes: Thumbnail垂直像素数  
  11.     (RGB)n               3n bytes: 打包的24bits RGB thumbnail像素 n = Xthumbnail*Ythumbnail  
  12. [可选的JFIF扩展APP0 marker段]  
  13. ...  
  14. ...  
  15. 0xFF, 0xCn                     SOFn(Start of Frame), length, frame paramters  
  16. ...  
  17. ...  
  18. 0xFF, 0xD9                     EOI (End of Image)  
由此刻见, APP0是JFIF特有的部分

Exif - Exchange Image File Format

这个标准是Camera产业联合会发布的,主要目的就是设计一种文件格式,方便交换照片文件的metadata

Exif文件的layout

[cpp] view plain copy
  1. SOI            0xFF, 0xD8    Start of frame  
  2. APP1           0xFF, 0xE1      Exif Attribute Information  
  3. APP2           0xFF, 0xE2      Flashpix Externsion data  
  4. ...  
  5. APPz           0xFF, 0xEn  
  6. DQT            0xFF, 0xDB  
  7. DHT            0xFF, 0xC4  
  8. DRI            0xFF, 0xDD  
  9. SOF            0xFF, 0xC0(0xFF, 0xC2)  
  10. SOS            0xFF, 0xDA  
  11.                Compressed Data  
  12. EOI            0xFF, 0xD9 
0 0