转载请注明:转自 http://blog.csdn.net/ymlbright [email protected]
JPEG文件使用的数据存储方式有多种。最常用的格式称为JPEG文件交换格式(JPEG File Interchange Format,JFIF)。而JPEG文件大体上由一个个数据段组成,数据段包含:标记码(Tag)、数据长度、数据。
标记码(Tag) 2 Bytes |
数据长度(大端序) 2Bytes |
数据 n-2 Bytes |
…… |
下一个数据段 |
标记码由两个字节构成,其前一个字节是固定值0xFF,后一个字节则根据不同意义有不同数值。在每个标记码之前还可以添加数目不限的无意义的0xFF填充,也就说连续的多个0xFF可以被理解为一个0xFF,并表示一个标记码的开始。而在一个完整的两字节的标记码后,就是该标记码对应的压缩数据流,记录了关于文件的诸种信息。
常用的标记有SOI、APP0、DQT、SOF0、DHT、DRI、SOS、EOI。
注意,SOI等都是标记的名称。在文件中,标记是以标记码形式出现的。例如SOI的标记代码为0xFFD8,即在JPEG文件中的如果出现数据0xFFD8,则表示此处为一个SOI标记。
SOI (0xFFD8) |
APP0(0xFFE0) |
APPn(0xFFEn) |
DQT(0xFFDB) |
SOFx(0xFFCx) |
DHT(0xFFC4) |
SOS(0xFFDA) |
scanData |
EOI(0xFFD9) |
标记名 |
标记代码 |
说明 |
帧开始标记,Start of Frame,非层次哈夫曼编码 |
||
SOF0 |
0xFFC0 |
基线离散余弦变换 |
SOF1 |
0xFFC1 |
扩展顺序离散余弦变换 |
SOF2 |
0xFFC2 |
递进离散余弦变换 |
SOF3 |
0xFFC3 |
空间顺序无损 |
帧开始标记,Start of Frame,层次哈夫曼编码 |
||
SOF5 |
0xFFC5 |
差分离散余弦变换 |
SOF6 |
0xFFC6 |
差分层次离散余弦变换 |
SOF7 |
0xFFC7 |
差分空间无损 |
帧开始标记,Start of Frame,非层次算术编码 |
||
JPEG |
0xFFC8 |
为JPEG扩展保留 |
SOF9 |
0xFFC9 |
扩展顺序离散余弦变换 |
SOF10 |
0xFFCA |
递进离散余弦变换 |
SOF11 |
0xFFCB |
空间顺序无损 |
帧开始标记,Start of Frame,层次算术编码 |
||
SOF13 |
0xFFCD |
差分离散余弦变换 |
SOF14 |
0xFFCE |
差分层次离散余弦变换 |
SOF15 |
0xFFCF |
差分空间无损 |
其他标记 |
||
DHT |
0xFFC4 |
定义哈夫曼树表 |
DAC |
0xFFCC |
定义算术编码表 |
RST0 |
OxFFD0 |
差分编码累计复位,共8个 |
…… |
…… |
|
RST7 |
OxFFD7 |
|
SOI |
OxFFD8 |
图像开始 |
EOI |
OxFFD9 |
图像结束 |
SOS |
0xFFDA |
开始扫描,图像数据开始 |
DQT |
0xFFDB |
定义量化表 |
DNL |
0xFFDC |
定义线数 |
DRI |
0xFFDD |
定义差分编码累计复位的间隔 |
DHP |
0xFFDE |
定义层次级数 |
EXP |
0xFFDF |
展开参考图像 |
APP0 |
0xFFE0 |
为应用程序保留,共15个 |
…… |
…… |
|
APP15 |
0xFFEE |
|
JPG0 |
0xFFF0 |
为JPEG扩展保留,共14个 |
…… |
…… |
|
JPG13 |
0xFFFD |
|
COM |
0xFFFE |
注释 |
TEM |
0xFF01 |
算术编码中作临时之用 |
RES |
0xFF02 |
保留,共189个 |
…… |
…… |
|
RES |
0xFFBF |