本文共 1856 字,大约阅读时间需要 6 分钟。
分析对象是一幅8x8的jpg图片。如下,图片已被放大并被虚线切分
用windows照片查看器查看图片详细信息:信息 参数
大小 667字节 尺寸 8x8 宽度 8像素 高度 8像素 水平分辨率 96dpi 垂直分辨率 96dpi 位深度 24 用UltraEdit打开图片,截图如下: 将该数据切分为10个部分,图中已做标记。预备知识
数据第一部分 JPEG格式由SOI(start of image)标记码开头:标记结构 字节数
0xFF 1 0xD8 1SOI不用解释。
紧接着是标记码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 (完,稍后整理)