JPEG文件格式分析及举例验证
目录
一、JPEG文件简介
二、JPEG文件格式分析
2.1 JPEG文件的段结构
2.2 JPEG文件的段类型
2.2.1 SOI文件头
2.2.2 APP0图像识别信息
2.2.3 DQT定义量化表
2.2.4 SOF0图像基本信息
2.2.5 DHT定义Huffman表
2.2.6 SOS扫描行开始
2.2.7 EOI文件尾
2.2.8 其他段
三、JPEG图片举例分析
3.1 SOI文件头
3.2 APP0图像识别信息
3.3 DQT定义量化表
3.4 SOF0图像基本信息
3.5 DHT定义Huffman表
3.6 SOS扫描行开始
3.7 EOI文件尾
3.8 DRI定义重新开始 (其他段)
一、JPEG文件简介
JPEG( Joint Photographic Experts Group)即联合图像专家组,是用于连续色调静态图像压缩的一种标准,文件后缀名为.jpg或.jpeg,是最常用的图像文件格式。其主要是采用预测编码(DPCM)、离散余弦变换(DCT)以及熵编码的联合编码方式,以去除冗余的图像和彩色数据,属于有损压缩格式,它能够将图像压缩在很小的储存空间,一定程度上会造成图像数据的损伤。尤其是使用过高的压缩比例,将使最终解压缩后恢复的图像质量降低,如果追求高品质图像,则不宜采用过高的压缩比例。
来源:百度百科
JPEG和JPG的联系:JPEG是一种文件格式,其常用的文件后缀名为.jpg和.jpeg。JPG只能做文件后缀名,而JPEG是文件格式,也可以是后缀名(扩展名)。
二、JPEG文件格式分析
JPEG图片格式存储结构:SOI(文件头)+APP0(图像识别信息)+ DQT(定义量化表)+ SOF0(图像基本信息)+ DHT(定义Huffman表) + DRI(定义重新开始间隔)+ SOS(扫描行开始)+ EOI(文件尾)
注:粗体字部分是一个文件必须拥有的
2.1 JPEG文件的段结构
JPEG文件是由若干个段构成,当JPEG每个段的信息完备,则该JPEG文件可以被打开。正因为JPEG文件是由段组成,那么JPEG文件的每个段中一定包含该段信息的一些标识。
因此我们有段的一般结构:
名称 | 字节数 | 数据 | 说明 |
---|---|---|---|
段标识 | 1 | FF | 每个新段的开始标识 |
段类型 | 1 | 0xXX | 类型编码 |
段长度 | 2 | 0xXX | 包括段内容和段本身长度,不包括段标识和段类型 |
段内容 | ≤65533字节 |
2.2 JPEG文件的段类型
JPEG文件必须有的段类型如下表:
名称 | 标记码 | 说明 |
---|---|---|
SOI | D8 | 文件头 |
EOI | D9 | 文件尾 |
SOF0 | C0 | 帧开始 |
SOF1 | C1 | 帧开始 |
DHT | C4 | 定义Huffman表 |
SOS | DA | 扫描行开始 |
DQT | DB | 定义量化表 |
DRI | DD | 定义重新开始间隔 |
APP0 | E0 | 定义交换格式和图像识别信息 |
COM | FE | 注释 |
注:段类型有30种,只有以上10种是必须被所有程序识别的。
接下来按照存储结构顺序来介绍各段类型
2.2.1 SOI文件头
名称 | 字节数 | 值 |
---|---|---|
段标识 | 1 | FF |
段类型 | 1 | D8 |
2.2.2 APP0图像识别信息
名称 | 字节数 | 值 | 说明 |
---|---|---|---|
段标识 | 1 | FF | |
段类型 | 1 | E0 | |
段长度 | 2 | 0010 | 如果有RGB缩略图则为16+3*n |
( 以下为 | 段 | 内 | 容 ) |
交换格式 | 5 | 4A46494600 | “JFIF”的ASCII码 |
主版本号 | 1 | 版本号 | |
次版本号 | 1 | 版本号 | |
密度单位 | 1 | 0:无单位;1:点数每英寸;2:点数每厘米 | |
X像素密度 | 2 | 水平方向密度 | |
Y像素密度 | 2 | 垂直方向密度 | |
缩略图X像素 | 1 | 缩略图水平方向数目 | |
缩略图Y像素 | 1 | 缩略图水平像素数目 | |
(如果缩略图X像素和缩略图Y像素均大于0才有下面内容) | |||
RGB缩略图 | 3*n | n=缩略图总像素数 |
2.2.3 DQT定义量化表
名称 | 字节数 | 值 | 说明 |
---|---|---|---|
段标识 | 1 | FF | |
段类型 | 1 | DB | |
段长度 | 2 | 43 | 其值=3+n |
( 以下为 | 段 | 内 | 容 ) |
QT信息 | 1 | 0~3位:QT号;4~7位:QT精度,0:8bit,1字节;否为16bit,2字节 | |
QT | n | n=64*QT精度的字节数 |
注:JPEG文件一般有两个DQT段,一个定义亮度,一个定义色度;一个DQT段可以包含多个QT,每个都有自己的信息字节。
2.2.4 SOF0图像基本信息
名称 | 字节数 | 值 | 说明 |
---|---|---|---|
段标识 | 1 | FF | |
段类型 | 1 | C0 | |
段长度 | 2 | 其值=8+组件数量*3 | |
( 以下为 | 段 | 内 | 容 ) |
样本精度 | 1 | 8 | 每个样本位数 |
图片高度 | 2 | ||
图片宽度 | 2 | ||
组件数量 | 1 | 3 | 1=灰度图,3=YCbCr/YIQ 彩色图,4=CMYK 彩色图 |
(以下每个组件占用3字节) | |||
组件ID | 1 | 1=Y, 2=Cb, 3=Cr, 4=I, 5=Q | |
采样系数 | 1 | 0~3位:垂直采样系数,4~7位:水平采样系数 | |
量化表号 | 1 |
2.2.5 DHT定义Huffman表
名称 | 字节数 | 值 | 说明 |
---|---|---|---|
段标识 | 1 | FF | |
段类型 | 1 | C4 | |
段长度 | 2 | 其值=19+n(只有一个HT表时) | |
( 以下为 | 段 | 内 | 容 ) |
HF信息 | 1 | 0~3位:HT号;4位:HT类型,0=DC表,1=AC表;5~7位:必须为0 | |
HT位表 | 16 | 16个数的和应该≤256 | |
HT值表 | n | n=表头16个数的和 |
注:一个DHT可以包含多个HT表,每个都有自己的信息字节。
2.2.6 SOS扫描行开始
名称 | 字节数 | 值 | 说明 |
---|---|---|---|
段标识 | 1 | FF | |
段类型 | 1 | DA | |
段长度 | 2 | 其值=6+2*扫描行内组件数量 | |
( 以下为 | 段 | 内 | 容 ) |
扫描行组件数量 | 1 | 3 | 必须在[1,4]中,通常为3 |
(以下每个组件占用2字节) | |||
组件ID | 1 | 1=Y, 2=Cb, 3=Cr, 4=I, 5=Q | |
Huffman表号 | 1 | 0~3位:AC表号;4~7位:DC表号 | |
剩余三字节 | 3 | 压缩图像资料(compressed image data) |
2.2.7 EOI文件尾
名称 | 字节数 | 值 | 说明 |
---|---|---|---|
段标识 | 1 | FF | |
段类型 | 1 | D9 |
2.2.8 其他段
(1)COM注释
名称 | 字节数 | 值 | 说明 |
---|---|---|---|
段标识 | 1 | FF | |
段类型 | 1 | FE | |
段长度 | 2 | 其值=注释字符的字节数+2 | |
段内容 | 注释字符 |
(2)DRI定义重新开始间隔
名称 | 字节数 | 值 | 说明 |
---|---|---|---|
段标识 | 1 | FF | |
段类型 | 1 | DD | |
段长度 | 2 | 4 | |
( 以下为 | 段 | 内 | 容 ) |
开始间隔 | 2 | n | 复位标记的间隔 |
三、JPEG图片举例分析
举例分析下图JPEG文件:
3.1 SOI文件头

段信息:
段标识=FF、段类型=D8
3.2 APP0图像识别信息

段信息:
段标识=FF、段类型=E0
段长度=00 01
交换格式=4A 46 49 46 00
主版本号=01,次版本号=01
密度单位=00
X像素密度=00 48
Y像素密度=00 48
缩略图X像素=00
缩略图Y像素=00
无RGB缩略图
3.3 DQT定义量化表

段信息:
段标识=FF、段类型=DB
段长度=00 43
QT信息=01
QT内容:蓝色框部分
3.4 SOF0图像基本信息

段信息:
段标识=FF、段类型=C0
段长度=00 11
样本精度=08
图片高度=00 92
图片宽度=00 A0
组件数量=03
组件ID=01,采样系数=22,量化表号=00
组件ID=02,采样系数=11,量化表号=01
组件ID=03,采样系数=11,量化表号=01
3.5 DHT定义Huffman表

段信息:
段标识=FF、段类型=C4
段长度=00 B5
HT信息=10
HT位表为最后一个红框部分
HT值为表图中蓝框部分
3.6 SOS扫描行开始

段信息:
段标识=FF、段类型=DA
段长度=00 0C
组件数量=03
组件ID=01,Huffman表号=00
组件ID=02,Huffman表号=11
组件ID=03,Huffman表号=11
压缩图像资料=00 3F 00
3.7 EOI文件尾

段信息:
段标识=FF、段类型=D9
3.8 DRI定义重新开始 (其他段)

段信息:
段标识=FF、段类型=DD
段长度=00 04
开始间隔=00 0A
参考博客:
jpeg图片格式详解_huabiaochen的博客-CSDN博客_jpeg 图片
jpg文件格式分析 - 道慧-道道都会 - 博客园
JPEG解码——(3)文件头解析 - OnlyTime_唯有时光 - 博客园