JPEG的数据结构

1.段的一般结构
名称    字节数 数据  说明
-----------------------------------------------------------------
段标识   1     FF    每个新段的开始标识
段类型   1           类型编码(称作标记码
段长度   2           包括段内容和段长度本身,不包括段标识和段类型
段内容               ≤65533字节
-----------------------------------------------------------------
  说明:
①JPG 文件中所有关于宽度高度长度间隔这一类数据,凡是>1字节的,均采用Motorola格式,即:高位在前,低位在后。
有些段没有长度描述也没有内容,只有段标识和段类型。文件头和文件尾均属于这种段。
段与段之间无论有多少FF都是合法的,这些FF称为填充字节,必须被忽略掉。
  

2.段类型有30种,但只有10种是必须被所有程序识别的,其它的类型都可以忽略。所以下面只列出这10种类型。

2:段类型
---------------------------------------
名称  标记码  说明
---------------------------------------
SOI    D8     文件头
EOI    D9     文件尾
SOF0   C0     帧开始(标准 JPEG
SOF1   C1     同上
DHT    C4     定义 Huffman 表(霍夫曼表)
SOS    DA     扫描行开始
DQT    DB     定义量化表
DRI    DD     定义重新开始间隔
APP0   E0     定义交换格式和图像识别信息
COM    FE     注释。

3.以下按一般JPEG文件的段排列顺序详细介绍各种段的结构:
SOI(文件头)
名称  字节数   值
段标识   1     FF
段类型   1     D8 
  说明:这两个字节构成了JPEG文件头。
APP0(图像识别信息)
--------------------------------------------------------------------------
名称       字节数 值          说明
--------------------------------------------------------------------------
段标识        1   FF
段类型        1   E0
段长度        2   0010        如果有RGB缩略图就=163n
  (以下为段内容)
交换格式      5   4A46494600  “JFIF”ASCII
主版本号      1
次版本号      1  
密度单位      1               0=无单位;1=点数/英寸;2=点数/厘米
X像素密度     2               水平方向的密度   
Y像素密度     2               垂直方向的密度
缩略图X像素   1               缩略图水平像素数目  
缩略图Y像素   1               缩略图垂直像素数目
(如果缩略图X像素缩略图Y像素的值均>0,那么才有下面的数据)
RGB缩略图    3×n             n=缩略图像素总数=缩略图X像素×缩略图Y像素
--------------------------------------------------------------------------
  说明:
①JFIFJPEG File Interchange Format的缩写,即JPEG文件交换格式,另外还有TIFF等格式,很少用
②“如果有RGB缩略图就=163n”是什么意思呢?比如说缩略图X像素缩略图Y像素的值均为48,就表示有一个48×48像素的缩略图(n=48×48),缩略图是24位真彩位图,用3个字节来表示一个像素,所以共占用3n个字节。但大多数JPG文件都没有这个鸡肋缩略图。
COM(注释)
--------------------------------------------------------------------------
名称    字节数   值    说明
--------------------------------------------------------------------------
段标识    1      FF
段类型    1      FE
段长度    2            其值=注释字符的字节数+2
段内容                 注释字符
-----------------------------------------说明:有的JPEG文件没有这个段。
DQT(定义量化表)

--------------------------------------------------------------------------
名称    字节数   值    说明
--------------------------------------------------------------------------
段标识    1      FF
段类型    1      DB
段长度    2      43    其值=3n(当只有一个QT时)
  (以下为段内容)
QT信息    1            03位:QT
                       47位:QT精度(08bit1字节;否则=16bit2字节)
QT        n            n64×QT精度的字节数
--------------------------------------------------------------------------说明:
①JPEG文件一般有2个DQT段,为Y值(亮度)定义1个C值(色度)定义1个。 
一个DQT段可以包含多个QT, 每个都有自己的信息字节
SOF0(图像基本信息)
--------------------------------------------------------------------------
名称  字节数   值    说明
--------------------------------------------------------------------------
段标识   1     FF
段类型   1     C0
段长度   2           其值=8+组件数量×3
  (以下为段内容)
样本精度  1    8     每个样本位数(大多数软件不支持1216
图片高度  2
图片宽度  2
组件数量  1    3     1=灰度图,3YCbCr/YIQ 彩×××,4CMYK 彩×××
  (以下每个组件占用3字节)
组件 ID   1          1Y, 2Cb, 3Cr, 4I, 5Q
采样系数  1          03位:垂直采样系数
                     47位:水平采样系数
量化表号  1
--------------说明:
①JPEG大都采用yCrCb色彩模型(y表示亮度,Cr红色分量,Cb表示蓝色分量),所以组件数量一般=3
样本就是单个像素的颜色分量,也可理解为一个样本就是一个组件
采样系数是实际采样方式与最高采样系数之比,而最高采样系数一般=0.5(分数表示为1/2)。比如说,垂直采样系数=2,那么2×0.51,表示实际采样方式是每个点采一个样,也就是逐点采样;如果垂直采样系数=1,那么:1×0.50.5(分数表示为1/2),表示每2个点采一个样
DHT(定义Huffman表)
--------------------------------------------------------------------------
名称    字节数   值    说明
--------------------------------------------------------------------------
段标识    1      FF
段类型    1      C4
段长度    2            其值=19n(当只有一个HT表时)
  (以下为段内容)
HT信息    1            03位:HT
                       4位:   HT类型, 0DC表,1AC
            57位:必须=0
HT位表    16           16个数的和应该≤256
HT值表    n            n=表头16个数的和
----说明:
①JPEG文件里有2类Haffman 表:一类用于DC(直流量),一类用于AC(交流量)。一般有4个表:亮度的DCAC,色度的DCAC。最多可有6个。
一个DHT 段可以包含多个HT每个都有自己的信息字节
③HT表是一个按递增次序代码长度排列的符号表。
DRI(定义重新开始间隔)
--------------------------------------------------------------------------
名称    字节数   值    说明
--------------------------------------------------------------------------
段标识    1      FF
段类型    1      DD
段长度    2      4 
  (以下为段内容)
开始间隔  2      n    复位标记的间隔距离
---------说明:
开始间隔表示在压缩数据流中,每隔n个MCU 块就有一个RST标记,RST标记将Huffman 的解码数据流复位,DC也重新从0开始,因此,RST标记是一种复位标记
②RST 标记是一种特殊的段,它只具有段标识和段类型(长度=2字节),但它不是独立的段,只能穿插在数据流中(文件头和文件尾段也只有段标识和段类型,却都是独立的段)。
③RST标记共有8个(RST0RST7),从RST0起开始使用,然后是RST1....直至RST7,再从RST0重复。
④RST标记的标识码是 FFD0FFD7,对应 RST0RST7
笔者查看了许多自己电脑上的JPG文件的数据,未发现DRI段和RST标记,所以无法进行详尽的考察

SOS(扫描行开始)
--------------------------------------------------------------------------
名称          字节数   值    说明
--------------------------------------------------------------------------
段标识           1     FF
段类型           1     DA
段长度           2     000C  其值=6扫描行内组件数量
  (以下为段内容)
扫描行内组件数量 1     3     必须≥1≤4(否则错误),通常=3
  (以下每个组件占用2字节)
组件ID           1           1 = Y, 2 = Cb, 3 = Cr, 4 = I, 5 = Q
Huffman表号      1           03位:AC表号 (其值=0...3)
                             47位:DC表号(其值=0...3)

                 3           最后3个字节用途不明,忽略
---------说明:紧接SOS段后的是压缩的图像数据(一个个扫描行),数据存放顺序是从左到右、从上到下。

EOI(文件尾)
------------------
名称  字节数   值
------------------
段标识   1     FF
段类型   1     D9 
------------------
  说明:这两个字节构成了JPEG文件尾。