首先,先来介绍下JPG文件
JPG文件使用的是一种有损的压缩算法,通过去除冗余信息和不可见的细节来减少文件大小
JPG图片的组成:SQI(文件头)+APP0(图像识别信息)+DQT(定义量化表)+SOF0(图像基本信息)+DHT(定义HUFFMAN表)+DRI(定义重新开始间隔)+SOS扫描开始+EOI(文件尾)j
加粗部分是JPG图像构成所必须的部分
JPEG(Joint Photographic Experts Group)压缩方式主要分为以下四个步骤:
- 颜色空间转换:将RGB颜色空间转换为亮度-色度(YCbCr)颜色空间。
- 离散余弦变换(DCT):对每个8×8像素块中的Y、Cb和Cr分量进行DCT变换,将其转换为频域表示。
- 量化:对DCT系数进行进一步的量化。通过除以一个量化矩阵来降低更多的精度
- 编码:使用哈夫曼(HUFFMAN)编码对量化后的DCT系数进行编码,以减小存储空间。
JPG文件的格式分为一个个的段来存储,段的长度和多少是不一定的。只要包含了足够的信息,那么JPG文件就是可以被打开的;。JPG文件的每个段都一定包含两部分:第一个是段的标识,第二个是段的长度。
既然说了JPG每个段一定包含两部分,那么先来讲讲每个段的结构
段的结构:
名称 |
字节数 |
数据 |
说明 |
段标识 |
1 |
FF |
每个新段的开始标识 |
段类型 |
1 |
每个段都不同 | 类型编码 |
段长度 |
2 |
不固定 | 包括段内容和段长度本身,不包括段表示和段类型 |
段内容 |
≤65533字节 |
接下来我们使用010 Editor工具打开一个JPG图像来观察一下
圈起来的就是就是我所说的每个段所一包含的两部分的第一个部分,也就是段的标识。我们使用010 Editor工具可以发现,许多部分被划为了不同的颜色,这就是不同的段,圈起来的FF,就是每个段的开头,段的标识。
段类型
名称 |
标记码 |
说明 |
SOI |
D8 |
文件头 |
EOI |
D9 |
文件尾 |
SOFO |
C0 |
帧开始 |
SOF1 |
C1 |
同上 |
DHT |
C4 |
定义HUFFMAN(哈夫曼)表 |
SOS |
DA |
扫描行开始 |
DQT |
DB |
定义量化表 |
DRI |
DD |
定义重新开始间隔 |
APP0 |
E0 |
定义交换格式和图象识别信息 |
COM |
FE |
注释 |
SOI文件头
JPG文件的开始两个字节都是FF D8这是固定的
可以看到FF D8正是这个JPG文件的文件头
SOI后跟的就是APP0(图像识别信息了)
APP0格式
名称 |
字节数 |
值 |