JPEG头分析

一个简单的JPG头分析

========SOI==========


========APP0==========

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


========DQT==========
0 43 0 5 3 4 4 4 3 5 4 4 4 5 5 5 6 7 C 8 7 7 7 7 F B B 9 C 11 F 12 12 11 F 11 11
 13 16 1C 17 13 14 1A 15 11 11 18 21 18 1A 1D 1D 1F 1F 1F 13 17 22 24 22 1E 24 1

C 1E 1F 1E

0 43 :                表示量化表DQT的长度,但不包括“DQT”这2个字节

0 :                      前4位表示量化精度参数(Pq),0为8位,1为16位;后4位为量化表目标标示符(Tq),即因为有多个量化表,这4位就作为序号,从0开始计数

5到1E:              共64个元素,即为量化表内容


========DQT==========
0 43 1 5 5 5 7 6 7 E 8 8 E 1E 14 11 14 1E 1E 1E 1E 1E 1E 1E 1E 1E 1E 1E 1E 1E 1E
 1E 1E 1E 1E 1E 1E 1E 1E 1E 1E 1E 1E 1E 1E 1E 1E 1E 1E 1E 1E 1E 1E 1E 1E 1E 1E 1

E 1E 1E 1E 1E 1E 1E 1E 1E 1E

同上,其中第3位 1: 由于是第2张量化表,计数为1


========SOF==========

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,即第二个量化表


========DHT==========

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,直至满足位数长度为止。


========DHT==========
0 B5 10 0 2 1 3 3 2 4 3 5 5 4 4 0 0 1 7D 1 2 3 0 4 11 5 12 21 31 41 6 13 51 61 7
 22 71 14 32 81 91 A1 8 23 42 B1 C1 15 52 D1 F0 24 33 62 72 82 9 A 16 17 18 19 1
A 25 26 27 28 29 2A 34 35 36 37 38 39 3A 43 44 45 46 47 48 49 4A 53 54 55 56 57
58 59 5A 63 64 65 66 67 68 69 6A 73 74 75 76 77 78 79 7A 83 84 85 86 87 88 89 8A
 92 93 94 95 96 97 98 99 9A A2 A3 A4 A5 A6 A7 A8 A9 AA B2 B3 B4 B5 B6 B7 B8 B9 B
A C2 C3 C4 C5 C6 C7 C8 C9 CA D2 D3 D4 D5 D6 D7 D8 D9 DA E1 E2 E3 E4 E5 E6 E7 E8

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==========
0 B5 11 0 2 1 2 4 4 3 4 7 5 4 4 0 1 2 77 0 1 2 3 11 4 5 21 31 6 12 41 51 7 61 71
 13 22 32 81 8 14 42 91 A1 B1 C1 9 23 33 52 F0 15 62 72 D1 A 16 24 34 E1 25 F1 1
7 18 19 1A 26 27 28 29 2A 35 36 37 38 39 3A 43 44 45 46 47 48 49 4A 53 54 55 56
57 58 59 5A 63 64 65 66 67 68 69 6A 73 74 75 76 77 78 79 7A 82 83 84 85 86 87 88
 89 8A 92 93 94 95 96 97 98 99 9A A2 A3 A4 A5 A6 A7 A8 A9 AA B2 B3 B4 B5 B6 B7 B
8 B9 BA C2 C3 C4 C5 C6 C7 C8 C9 CA D2 D3 D4 D5 D6 D7 D8 D9 DA E2 E3 E4 E5 E6 E7

E8 E9 EA F2 F3 F4 F5 F6 F7 F8 F9 FA

同上


========SOS==========

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。


然后就是压缩图像的数据了。图像数据一般按照





展开阅读全文

没有更多推荐了,返回首页