前言
本文排版有些乱,例子镶嵌在每个知识点里,但整体实例都是按照顺序讲解的,而对于讲过的知识点不再赘述。
本文也将持续更新。
段结构
JPG文件由一个个段构成
JPG图片所有数据都是高位在前
字节
这个红色框框里的两个数表示一个字节
高位在前
什么是高位在前?
例如现实生活中1234,高位在前则表示12 34
而winhex的都是低位在前,在后面会讲到段长度,如00 10,低位在前则表示10 00
段结构包括:
段标识|段类型|段长度|端数据
段标识
1字节
,固定为FF
H,H表示16进制
段类型
1字节
文件头
名称 SOI
标记码 D8
如图,D8表示本jpg文件的文件头,前面的FF表示段标识
文件尾
名称 EOI
标记码 D9
拉到最后,FF D9表示文件尾
帧开始(标准JPEG)
- 名称
SOF0
标记码C0
- 名称
SOF1
标记码C1
C0与C1在一个文件里只会存在一种,下面以C0为例,C1同样操作
我们查找 FF C0
后面两个字节00 11
表示段长度,将十六进制转为十进制,可以知道后面有15个字节的数据(段长度占了2字节,并且不包括段标识和段类型)
那么我们可以看到后面的数据
标志08
1个字节
这个标志固定是08
y轴分辨率
2字节
计算一下,
与实际的分辨率(高度)一样
x轴分辨率
2字节
这两字节表示x轴分辨率,计算一下
与实际上文件的属性是一样的
组件数量03
这1个字节固定为03
从03之后的9个字节,都为组件数据,且每个组件数据为3个字节
。
组件大小和数量都为固定的。
定义Huffman表(霍夫曼表)
名称 DHT
标记码 C4
固定4
个FF C4
其中2个记录亮度,2个记录色度
段长度
2字节
不包含段标识、段类型
例子在帧开始处讲了
段数据
长度为段长度-2
参考资料
https://www.bilibili.com/video/BV1MJ411p7Ly/?spm_id_from=333.999.0.0&vd_source=b914a8de9ea8b12ba5cb6d8edd1b346c