分析对象是一幅8x8的jpg图片。如下,图片已被放大并被虚线切分
用windows照片查看器查看图片详细信息:
信息 | 参数 |
---|---|
大小 | 667字节 |
尺寸 | 8x8 |
宽度 | 8像素 |
高度 | 8像素 |
水平分辨率 | 96dpi |
垂直分辨率 | 96dpi |
位深度 | 24 |
用UltraEdit打开图片,截图如下:
将该数据切分为10个部分,图中已做标记。
预备知识
JPEG文件由两部分组成:标记码和压缩数据。JPEG图像所有信息都由标记码记录,标记码之间用若干个0xFF分开。
- 数据第一部分
JPEG格式由SOI(start of image)标记码开头:
标记结构 | 字节数 |
---|---|
0xFF | 1 |
0xD8 | 1 |
SOI不用解释。
紧接着是标记码APP0(application),JFIF将文件的相关信息定义在此标记中,如下
标记结构 | 字节数 | 意义 | 对应数据(十六进制) |
---|---|---|---|
0xFF | 1 | FF | |
0xE0 | 1 | E0 | |
Lp | 2 | APP0标记码长度 | 00 10(由此看出该标记码长度为16字节) |
Identifier | 5 | JFIF识别码 | 4A 46 49 46 00(“JFIF”) |
Version | 2 | JFIF版本号 | 01 01 |
Units | 1 | 单位 | 01 |
Xdensity | 2 | 水平分辨率 | 00 60(90dpi) |
Ydensity | 2 | 垂直分辨率 | 00 60(90dpi) |
Xthumbnail | 1 | 水平点数 | 00 |
Ythumbnail | 1 | 垂直点数 | 00 |
至此,数据第一部分分析完。
- 数据第二部分
该部分是DQT(define quantization table)标记码。看看该标记码格式:
标记结构 | 字节数 | 意义 | 对应数据(十六进制) |
---|---|---|---|
0xFF | 1 | FF | |
0xDB | 1 | DB | |
Lq | 2 | DQT标记码长度 | 00 43(67字节) |
(Pq, Tq) | 1 | 在基本系统中Pq=0,Tq=0~1 | 00(说明后面量化表中的每个值为1个字节) |
Q0 | 1或2 | 量化表的值 | 02 |
Q1 | 1或2 | 量化表的值 | 01 |
… | |||
Qn | 1或2 | 量化表的值 | 0c |
至此,数据第二部分也分析完
数据第三部分
该部分数据开头为0xFF 0xDB,显然该部分也是个DQT标记码,分析如上,不再赘述。数据第四部分
该部分开头为0xFF 0xC0,该部分为SOF(start of frame)标记,基线离散余弦变换
标记结构 | 字节数 | 意义 | 对应数据(十六进制) |
---|---|---|---|
0xFF | 1 | FF | |
0xC0 | 1 | C0 | |
Lf | 2 | SOF标记码长度 | 11(17字节) |
P | 1 | 基本系统中为8 | 08 |
Y | 2 | 图像高度 | 00 08(8个像素) |
X | 2 | 图像宽度 | 00 08(8个像素) |
Nf | 1 | 为1代表灰度图,为3代表彩色图 | 03(彩色) |
C1 | 1 | 成分编号 1 | 01 |
(H1, V1) | 1 | 第一个采样因子 | 22 |
Tq1 | 1 | 该量化表编号 | 00 |
… | |||
Cn | 1 | 成分编号n | 03 |
(Hn,Vn) | 1 | 第n个采样因子 | 11 |
Tqn | 1 | 该量化表编号 | 01 |
- 数据第五部分
该部分开头为0xFF 0xC4,是DHT(define huffman table)标记码定义了哈弗曼树表
标记结构 | 字节数 | 意义 | 对应数据(十六进制) |
---|---|---|---|
0xFF | 1 | FF | |
0xC4 | 1 | C4 | |
Lh | 2 | DHT标记码长度 | 00 1F(31个字节) |
(Tc, Th) | 1 | 00 | |
L1 | 1 | 00 | |
… | |||
L16 | 1 | 00 | |
V1 | 1 | 01 | |
… | |||
Vt | 1 | 0B |
该标记中,Tc为0指DC所用的Huffman表,Tc为1指AC所用的Huffman表,Th的值为0或1,2Tc+Th表示Huffman表的编号(最多4个),Ln表示每个n为Huffman码字的个数,n = 1~16。Vt表示每个Huffman码字所对应的值,t = L1+L2+…+L16
数据第六部分
同上数据第七部分
同上数据第八部分
同上数据第九部分
该部分为SOS(start of scan)标记码,如下表
标记结构 | 字节数 | 意义 | 对应数据(十六进制) |
---|---|---|---|
0xFF | 1 | FF | |
0xDA | 1 | DA | |
Ls | 2 | SOS标记码长度 | 00 0C |
Ns | 1 | ||
Cs1 | 1 | ||
… | |||
(Td1,Ta1) | 1 | ||
CsNs | |||
(TdNs,TaNs) | |||
Ss | |||
Se | |||
(Ah,Al) |
Ns为scan中成分的个数,CsNs为在scan中的编号,TdNs为高4位,TaNs为低4位,分别表示DC和AC编码表的编号, 基本系统中,Ns = Nf,Ss,Se,Ah,Al均为0
- 数据第十部分
图像结束标记码0xFF 0xD9,标记码EOF(end of image)
标记结构 | 字节数 |
---|---|
0xFF | 1 |
0xD9 | 1 |