文件结构
JFIF文件格式直接使用JPEG标准为应用程序定义的许多标记,因此JFIF格式成了事实上JPEG文件交换格式标准。JPEG的每个标记都是由2个字节组成,其前一个字节是固定值0xFF。每个标记之前还可以添加数目不限的0xFF填充字节(fill byte)。下面是其中的8个标记:
- SOI 0xD8 图像开始
- APP0 0xE0 JFIF应用数据块
- APPn 0xE1 - 0xEF 其他的应用数据块(n, 1~15)
- DQT 0xDB 量化表
- SOF0 0xC0 帧开始
- DHT 0xC4 霍夫曼(Huffman)表
- SOS 0xDA 扫描线开始
- EOI 0xD9 图像结束
为使读者对JPEG定义的标记一目了然,现将JPEG的标记码列于表6-05,并保留英文解释。
表6-05 JPEG定义的标记
Symbol (符号) | Code Assignment (标记代码) | Description (说明)
|
Start Of Frame markers, non-hierarchical Huffman coding | ||
SOF0 | 0xFFC0 | Baseline DCT |
SOF1 | 0xFFC1 | Extended sequential DCT |
SOF2 | 0xFFC2 | Progressive DCT |
SOF3 | 0xFFC3 | Spatial (sequential) lossless |
Start Of Frame markers, hierarchical Huffman coding | ||
SOF5 | 0xFFC5 | Differential sequential DCT |
SOF6 | 0xFFC6 | Differential progressive DCT |
SOF7 | 0xFFC7 | Differential spatial lossless |
Start Of Frame markers, non-hierarchical arithmetic coding | ||
JPG | 0xFFC8 | Reserved for JPEG extensions |
SOF9 | 0xFFC9 | Extended sequential DCT |
SOF10 | 0xFFCA | Progressive DCT |
SOF11 | 0xFFCB | Spatial (sequential) Lossless |
Start Of Frame markers, hierarchical arithmetic coding | ||
SOF13 | 0xFFCD | Differential sequential DCT |
SOF14 | 0xFFCE | Differential progressive DCT |
SOF15 | 0xFFCF | Differential spatial Lossless |
Huffman table specification | ||
DHT | 0xFFC4 | Define Huffman table(s) |
arithmetic coding conditioning specification | ||
DAC | 0xFFCC | Define arithmetic conditioning table |
Restart interval termination | ||
RSTm | 0xFFD0~0xFFD7 | Restart with modulo 8 counter m |
Other marker | ||
SOI | 0xFFD8 | Start of image |
EOI | 0xFFD9 | End of image |
SOS | 0xFFDA | Start of scan |
DQT | 0xFFDB | Define quantization table(s) |
DNL | 0xFFDC | Define number of lines |
DRI | 0xFFDD | Define restart interval |
DHP | 0xFFDE | Define hierarchical progression |
EXP | 0xFFDF | Expand reference image(s) |
APPn | 0xFFE0~0xFFEF | Reserved for application use |
JPGn | 0xFFF0~0xFFFD | Reserved for JPEG extension |
COM | 0xFFFE | Comment |
Reserved markers | ||
TEM | 0xFF01 | For temporary use in arithmetic coding |
RES | 0xFF02~0xFFBF | Reserved |
JPEG文件由下面的8个部分组成:
(1) 图像开始SOI(Start of Image)标记
(2) APP0标记(Marker)
① APP0长度(length)
② 标识符(identifier)
③ 版本号(version)
④ X和Y的密度单位(units=0:无单位;units=1:点数/英寸;units=2:点数/厘米)
⑤ X方向像素密度(X density)
⑥ Y方向像素密度(Y density)
⑦ 缩略图水平像素数目(thumbnail horizontal pixels)
⑧ 缩略图垂直像素数目(thumbnail vertical pixels)
⑨ 缩略图RGB位图(thumbnail RGB bitmap)
(3) APPn标记(Markers),其中n=1~15(任选)
① APPn长度(length)
② 由于详细信息(application specific information)
(4) 一个或者多个量化表DQT(difine quantization table)
① 量化表长度(quantization table length)
② 量化表数目(quantization table number)
③ 量化表(quantization table)
(5) 帧图像开始SOF0(Start of Frame)
① 帧开始长度(start of frame length)
② 精度(precision),每个颜色分量每个像素的位数(bits per pixel per color component)
③ 图像高度(image height)
④ 图像宽度(image width)
⑤ 颜色分量数(number of color components)
⑥ 对每个颜色分量(for each component)
-
- ID
- 垂直方向的样本因子(vertical sample factor)
- 水平方向的样本因子(horizontal sample factor)
- 量化表号(quantization table#)
(6) 一个或者多个霍夫曼表DHT(Difine Huffman Table)
① 霍夫曼表的长度(Huffman table length)
② 类型、AC或者DC(Type, AC or DC)
③ 索引(Index)
④ 位表(bits table)
⑤ 值表(value table)
(7) 扫描开始SOS(Start of Scan)
① 扫描开始长度(start of scan length)
② 颜色分量数(number of color components)
③ 每个颜色分量
-
- ID
- 交流系数表号(AC table #)
- 直流系数表号(DC table #)
④ 压缩图像数据(compressed image data)
(8) 图像结束EOI(End of Image)
表6-06表示了APP0域的详细结构。有兴趣的读者可通过UltraEdit或者PC TOOLS等工具软件打开一个JPG图像文件,对APP0的结构进行分析和验证。
表6-06 JFIF格式中APP0域的详细结构
偏移 | 长度 | 内容 | 块的名称 | 说明 |
0 | 2 byte | 0xFFD8 | (Start of Image,SOI) | 图像开始 |
2 | 2 byte | 0xFFE0 | APP0(JFIF application segment) | JFIF应用数据块 |
4 | 2 bytes | length of APP0 block | APP0块的长度 | |
6 | 5 bytes | "JFIF"+"0" | 识别APP0标记 | |
11 | 1 byte | <Major version> | 主要版本号(如版本1.02中的1) | |
12 | 1 byte | <Minor version> | 次要版本号(如版本1.02中的02) | |
13 | 1 byte | <Units for the X | X和Y的密度单位 units=0:无单位 units=1:点数/英寸 units=2:点数/厘米
| |
14 | 2 bytes | <Xdensity> | 水平方向像素密度 | |
16 | 2 bytes | <Ydensity> | 垂直方向像素密度 | |
18 | 1 byte | <Xthumbnail> | 缩略图水平像素数目 | |
19 | 1 byte | <Ythumbnail> | 缩略图垂直像素数目 | |
3n | < Thumbnail RGB bitmap> | 缩略RGB位图(n为缩略图的像素数) | ||
Optional JFIF extension APP0 marker segment(s) | 任选的JFIF扩展APP0标记段 | |||
…… | …… | |||
2 byte | 0xFFD9 | (EOI) end-of-file | 图像文件结束标记 |