一个简单的JPG头分析
========SOI==========
0 10 4A 46 49 46 0 1 1 1 0 48 0 48 0 0
0 10 : 表示APPO数据段的长度,但不包括“APPO”这2个字节。
4A 46 49 46 0 : 文件标示符,即“JFIF” + “NULL”的ASCII码
1 1 : 文件版本号,一般为 1 1或者1 2
1 : 表示X和Y的密度单位,0为无单位,1为”点数/英寸“,2为”点数/厘米“
0 48: X轴方向的密度
0 48: Y轴方向的密度
0 : 缩略图水平像素数目,一般为0
0: 缩略图垂直像素数目,一般为0
C 1E 1F 1E
0 43 : 表示量化表DQT的长度,但不包括“DQT”这2个字节
0 : 前4位表示量化精度参数(Pq),0为8位,1为16位;后4位为量化表目标标示符(Tq),即因为有多个量化表,这4位就作为序号,从0开始计数
5到1E: 共64个元素,即为量化表内容
E 1E 1E 1E 1E 1E 1E 1E 1E 1E
同上,其中第3位 1: 由于是第2张量化表,计数为1
0 11 8 1 E0 2 80 3 1 22 0 2 11 1 3 11 1
0 11: 表示SOF数据段长度,但不包括“SOF”这2个字节
8: 采样精度(P),指定帧中分量的样品精度,这里为8位
1 E0: 行数(Y),指定独享中的最大行数
2 80: 每行样本数(X),指定源图像中每行的最大采样数,即为列数
3: 帧中图像的分量数(Nf),指定帧中源图像的分量数,这里的分量数一般都为3,即Y,Cb,Cr,灰度,色度x,色度y
1: 分量标记符(C),用来致命帧分量说明序列中的哪一个分量,这里是C1,即第一个分量
22: 前4位为水平采用因子(H),表示指定分量水平尺寸和最大图像尺寸X之间的关系;后4位为垂直采样因子(V),表示垂直尺寸和最大图像尺寸Y之间的关系
0: 量化表目标选择器(Tq),用来表示选择哪一个量化表,这个选择计数为0的量化表,即第一个量化表
2: 分量标记符(C2),这里表示第二个分量
11: 前4位为水平采用因子(H2);后4位为垂直采样因子(V2)
1: 量化表目标选择器(Tg2),这里表示选择量化表1,即第二个量化表
3: 分量标记符(C3),这里表示第三个分量
11: 前4位为水平采用因子(H3);后4位为垂直采样因子(V3)
1: 量化表目标选择器(Tg3),这里表示选择量化表1,即第二个量化表
0 1F 0 0 1 5 1 1 1 1 1 1 0 0 0 0 0 0 0 0 1 2 3 4 5 6 7 8 9 A B
0 1F: 表示哈夫曼表长度,但不包括“DHT”这2个字节
0: 前4位表示类型(Tc):0为DC表或无失真,1为AC表;后4为计数表示第几张表。综合此处表示用于DC的第一张哈夫曼表。
0到B: 哈夫曼表的内容。
哈夫曼表详解: 长度为i的哈夫曼代码数目(Li),共16个字节,分别为JPEG说明中允许的hfm代码长度为1到16的每个码长指定代码数目,这里表示代码长度为1的哈夫曼代码有0个,长度为2个hfm代码有1个,长度为3的hfm代码有5个,等等。1+5+六个1+七个0 = 12所以接下来会有12个字节的数据。
16个字节之后的12个字节:0 1 2 3 到 B:对应每个编码的代码值。
针对Li列出长度为i的hfm代码值,具体如下:
L1 = 0,没有码长为1的hfm代码;
L2 = 1,码长为2的hfm代码为00;对应的值为0,即数字"0"经过哈夫曼编码后为00
L3 = 5,码长为3的hfm代码为010,100,101,110,111,即数字1,2,3,4,5经过哈夫曼编码后为010,100,101,110,111
L4 = 1,码长为4的hfm代码为1000
L5= 1,码长为5的hfm代码为10010,即1000 + 1再在后面补0到5位。
以此类推。第一个数永远是0,根据其位数,补满位数,如第一个为L2则要表示成00,若第一个为L3,则要表示成000.然后之后的数字按如下规则:如果它和它前面的码字位数相同,则当前码字为它前面的码字加1;如果它的位数比它前面的码字位数大,则当前码字是前面的码字加1后再在后边添若干个0,直至满足位数长度为止。
E9 EA F1 F2 F3 F4 F5 F6 F7 F8 F9 FA
同上
========DHT==========0 1F 1 0 3 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 1 2 3 4 5 6 7 8 9 A B
同上
========DHT==========E8 E9 EA F2 F3 F4 F5 F6 F7 F8 F9 FA
同上
0 C 3 1 0 2 11 3 11 0 3F 0
0 C: 表示SOS数据段长度,但不包括SOS这2个字节。
3: 扫描行中图像分量数目(Ns),指定扫描行中源图像分量的数目。
1: 扫描分量选择器(Cs),这里表示第一个分量
0: 前4位为DC熵编码表目标选择器(Td),表示选择哪一张DC哈夫曼表。后4位表示选择哪一张AC哈夫曼表。
2: Cs2,表示第2个分量
11: 前4位为DC熵编码表目标选择器(Td),表示选择哪一张DC哈夫曼表。后4位表示选择哪一张AC哈夫曼表。
3: Cs2,表示第3个分量
11: 前4位为DC熵编码表目标选择器(Td),表示选择哪一张DC哈夫曼表。后4位表示选择哪一张AC哈夫曼表。
0: 频谱或预测期选择开始参数(Ss),该参数指定“Z”型序列中每个块的第一个DCT系数,对于顺序DCT过程,该参数应该置为0;
3F: 频谱选择结束参数(Se),该参数指定“Z”型参数序列中最后1个DCT系数,对于顺序DCT过程,该参数应该置为63;
0: 前4位为后续近似位位置高参数(Ah),后4位为后续近似位位置低或点变换参数(AI),一般都置为0。
然后就是压缩图像的数据了。图像数据一般按照