一.实验原理
(1)JPEG的文件格式
SOI,Start of Image,图像开始,
固定值
0xFFD8
APP0,Application,应用程序保留标记0,
固定值
0xFFE0
9个具体字段:
① 数据长度 2字节 ①~⑨9个字段的总长度
②标识符 5字节 固定值0x4A46494600,即字符串“JFIF0”
③ 版本号 2字节 一般是0x0102,表示JFIF的版本号1.2
④ X 和 Y 的密度单位 1字节 只有三个值可选
0:无单位;1:点数/英寸;2:点数/厘米
⑤ X 方向像素密度 2字节 取值范围未知
⑥ Y 方向像素密度 2字节 取值范围未知
⑦ 缩略图水平像素数目 1字节 取值范围未知
⑧ 缩略图垂直像素数目 1字节 取值范围未知
⑨ 缩略图 RGB 位图 长度可能是3的倍数 缩略图RGB位图数据
②标识符 5字节 固定值0x4A46494600,即字符串“JFIF0”
③ 版本号 2字节 一般是0x0102,表示JFIF的版本号1.2
④ X 和 Y 的密度单位 1字节 只有三个值可选
0:无单位;1:点数/英寸;2:点数/厘米
⑤ X 方向像素密度 2字节 取值范围未知
⑥ Y 方向像素密度 2字节 取值范围未知
⑦ 缩略图水平像素数目 1字节 取值范围未知
⑧ 缩略图垂直像素数目 1字节 取值范围未知
⑨ 缩略图 RGB 位图 长度可能是3的倍数 缩略图RGB位图数据
DQT,Define Quantization Table,定义量化表,
固定值
0xFFDB
n包含9个具体字段:
① 数据长度 2字节 字段①和多个字段②的总长度
② 量化表 数据长度-2字节
① 数据长度 2字节 字段①和多个字段②的总长度
② 量化表 数据长度-2字节
a)
精度及量化表
ID
1字节
高4位:精度,只有两个可选值 0:8位;1:16位
低4位:量化表ID,取值范围为0~3
b)表项 (64×(精度+1))字节
例如8位精度的量化表,其表项长度为64×(0+1)=64字节
本标记段中,字段②可以重复出现,表示多个量化表,但最多只能出现4次
SOF0,Start of Frame,帧图像开始,
固定值
0xFFC0
9个具体字段:
① 数据长度 2字节 ①~⑥六个字段的总长度
②精度 1字节 每个数据样本的位数
通常是8位,一般软件都不支持 12位和16位
③ 图像高度 2字节 图像高度(单位:像素)
②精度 1字节 每个数据样本的位数
通常是8位,一般软件都不支持 12位和16位
③ 图像高度 2字节 图像高度(单位:像素)
④图像宽度 2字节 图像宽度(单位:像素)
⑤颜色分量数 1字节 只有3个数值可选
1:灰度图;3:YCrCb或YIQ;4:CMYK
而JFIF中使用YCrCb,故这里颜色分量数恒为3
⑥ 颜色分量信息 颜色分量数×3字节(通常为9字节)
1:灰度图;3:YCrCb或YIQ;4:CMYK
而JFIF中使用YCrCb,故这里颜色分量数恒为3
⑥ 颜色分量信息 颜色分量数×3字节(通常为9字节)
a)
颜色分量
ID 1字节
b)水平/垂直采样因子 1字节
高4位:水平采样因子低4位:垂直采样因子
c) 量化表 1字节 当前分量使用的量化表的ID
DHT,Define Huffman Table,定义哈夫曼表,
固定值
0xFFC4
2
个具体字段
:
① 数据长度 2字节
② huffman表 数据长度-2字节
表ID和表类型 1字节
高4位:类型,只有两个值可选
0:DC直流;1:AC交流
低4位:哈夫曼表ID
注意,DC表和AC表分开编码
不同位数的码字数量 16字节
编码内容 16个不同位数的码字数量之和(字节)本标记段中,字段②可以重复出现(一般4次),也可以只出现1次
SOS,Start of Scan,扫描开始12字节,
固定值
0xFFDA
2个具体字段:
①数据长度 2字节 ①~④两个字段的总长度
②颜色分量数 1字节 应该和SOF中的字段⑤的值相同,即:
1:灰度图是;3: YCrCb或YIQ;4:CMYK。
②颜色分量数 1字节 应该和SOF中的字段⑤的值相同,即:
1:灰度图是;3: YCrCb或YIQ;4:CMYK。
③颜色分量信息
a) 颜色分量 ID 1字节
b) 直流 / 交流系数表号 1字节
a) 颜色分量 ID 1字节
b) 直流 / 交流系数表号 1字节
高4位:直流分量使用的哈夫曼树编号
低4位:交流分量使用的哈夫曼树编号
④压缩图像数据
a)谱选择开始 1字节 固定值0x00
b)谱选择结束 1字节 固定值0x3F
c)谱选择 1字节 在基本JPEG中总为00
b)谱选择结束 1字节 固定值0x3F
c)谱选择 1字节 在基本JPEG中总为00
EOI,End of Image,图像结束2字节,
固定值
0xFFD9
(2)huffman表存储方式的说明
在标记段DHT内,包含了一个或者多个的哈夫曼表。对于单一个哈夫曼表,应该包括了三部分:
(1)
哈夫曼表
ID
和表类型
这个字节的值为一般只有四个0x00、0x01、0x10、0x11。
0x00 表示 DC 直流 0 号表;
0x01 表示 DC 直流 1 号表;
0x10 表示 AC 交流 0 号表;
0x11 表示 AC 交流 1 号表。
0x00 表示 DC 直流 0 号表;
0x01 表示 DC 直流 1 号表;
0x10 表示 AC 交流 0 号表;
0x11 表示 AC 交流 1 号表。
(2)
不同位数的码字数量
(3)