转载请注明:转自 http://blog.csdn.net/ymlbright yml_bright@163.com
一、总体结构
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) |
二、常用标记码数据段
1.SOI
2.APP0
3.APP1
4.APPn
5.DQT
6.SOF0
7.DHT
7.SOS
8.scanData
9.EOI
三、其他标记码
标记名 | 标记代码 | 说明 |
帧开始标记,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 |