JPEG的文件格式

JPEG的文件格式

JPEG图片格式组成部分:SOI(文件头)+APP0(图像识别信息)+[APPn(0xFFEn)]可选+ DQT(定义量化表)+
SOF0(图像基本信息)+ DHT(定义Huffman表) + DRI(定义重新开始间隔)+ SOS(扫描行开始)+ EOI(文件尾)

其中粗体部分是必须的,下面我就来解释一下这些信息吧。

JPEG的文件分为若干个块,以FF开头,如下图所示

第一列是标记符,第二列十六进制数据,第三列含义

在这里插入图片描述

将一个JPEG格式的图片去掉后缀,使用sublime等软件可以直接查看二进制(显示为16进制)

打开一个750*562 JPG图片的二进制:

标识符APP0,FFE0开始,图像识别信息

ffe0 0010 4a46 4946 0001 0101 0048
0048 0000

0010指该块长度为16个字节(不包括ffe0)

4a46 4946 00是JFIF格式标识码

01 01是版本号(第一个01是主版本号,第二个01是次版本号)

01是密度单位(00=无单位;01=点数/英寸;02=点数/厘米)

0048为水平像素密度

0048为垂直像素密度

00为X缩略图像素(基本不用)

00为Y缩略图像素(基本不用)

标识符DQT,FFdb开始,量化表的数据

①.

ffdb 0043 0009 0607 0807 0609
0807 080a 0a09 0b0d 160f 0d0c 0c0d 1b14
1510 1620 1d22 2220 1d1f 1f24 2834 2c24
2631 271f 1f2d 3d2d 3135 373a 3a3a 232b
3f44 3f38 4334 393a 37

②.

ff db00 4301 0a0a
0a0d 0c0d 1a0f 0f1a 3725 1f25 3737 3737
3737 3737 3737 3737 3737 3737 3737 3737
3737 3737 3737 3737 3737 3737 3737 3737
3737 3737 3737 3737 3737 3737 3737

JPEG有2个DQT段,以FFDB开始,第一个DQT段表示亮度Y的量化表,第二个表示色度C的量化表

注:量化表示可以自己实现的,不是必须和JPEG提供的量化表一致

0043 表示当前段的长度(不包含FFDB)

QT信息1个字节:

①:00 => 0-3位是QT号,4-7位QT精度,此处是0,所以精度是8bit,即1个字节。

②:01 => QT号是1,精度是8bit

后面64个字节是8*8的量化表,量化表根据QT信息确定,8bit的精度就是64

标识符SOFO,FFC0开始,图像的基本信息

ffc0 0011 0802 3202 ee03 0122 0002 1101 0311 01

JPEG大都采用yCrCb色彩模型(y表示亮度,Cr红色分量,Cb表示蓝色分量),所以组件数量一般=3

段长度2个字节:00 11 => 17 = 8 + 3*3,说明组件数量有3个

样本精度1个字节:08,每个样本的信息是8bit

样本高度2个字节:02 32 => 562图片宽度与实际一致

样本宽度2个字节:02 ee => 750图片高度与实际一致

组件数量1个字节:03 => 代表YCbCr 彩色图,有3个组件分别是Y、Cb、Cr

每个组件占用3个字节:第一个字节是组件ID,第二个字节是采样系数,第三个字节是量化表号。

此处是:

01 22 00 => Y组件,垂直采样系数和水平采样系数都是2,量化表号是0

02 11 01 => Cb组件,垂直采样系数和水平采样系数都是1,量化表号是1

03 11 01 => Cr组件,垂直采样系数和水平采样系数都是1,量化表号是1

注:此处可知此处Y采样是逐点采样,CbCr都是隔点采样,这就是标准的YUV422的数据

标识符DHT,FFC4开始,定义huffman表

①.

ff c4 00 1c 00 0001 0501 0101 0000 0000
0000 0000 0000 0400 0102 0305 0607 08

②.

ff c400 4510 0001 0400 0404 0403 0604 0405
0304 0301 0100 0203 1104 1221 3105 4151
6106 1322 7132 8191 1442 52a1 b1c1 2362
72d1 2433 e1f0 0715 2543 8234 92f1 1635
73c2 5363 a2b2

③.

ffc4 001b 0100 0203 0101
0100 0000 0000 0000 0000 0001 0200 0304
0506 07

④.

ff c400 3211 0002 0202 0201 0205
0401 0305 0101 0000 0001 0211 0321 0431
1205 4113 2232 5161 1423 3371 8124 34b1
4291 a1d1 f052 c1

FFC4 起始位置

以①为例,段长度 001C =>28 = 19(段长度2个字节+HT信息1个字节+HT位表16个字节) + 9(这个数代表HT表有9个字节)

HT信息1个字节:0-3位是HT号,4位是HT类型(0=DC表,1=AC表),5-7位必须为0

以①为例子 00 => HT号是0,DC表

以②为例子 10 => HT号是0,AC表

以③为例子 01 => HT号是1,DC表

以④为例子 11 => HT号是1,AC表

注:此处一共有4个Haffman 表,亮度DC Haffman 表,亮度AC Haffman 表,色度DC Haffman 表,色度AC Haffman 表

HT位表16个字节:这16个数字值和小于等于256

以①为例子 0001 0501 0101 0000 0000 0000 0000 0000 => 共16个字节,加起来是9(此处和段长度是相匹配的),说明HT表有9个字节

HT值表

以①为例:0400 0102 0305 0607 08

标识符SOS,FFDA开始,扫描行开始

ff da00 0c03 0100 0211 0311

FFDA起始位置

段长度 000C =>12=6(2个字节的扫描行开始头+1个字节扫描行内组件数量+3个字节的剩余位) + 2×3(扫描行内组件数量,每个组件2个字节)

扫描行内组件数量1个字节:03 => 代表组件数量数3

每个组件占用2个字节:

第一个字节是组件ID(1 = Y, 2 = Cb, 3 = Cr, 4 = I, 5 = Q);第二个字节0-3位AC表号,4-7位DC表号。表号的值是0-3。

01 00 => Y组件,AC表号是0,DC表号是0

02 11 => Cb组件,AC表号是1,DC表号是1

03 11 => Cr组件,AC表号是1,DC表号是1

//此处跟DHT(定义Huffman表)的HT信息是一致的

后续实现JPEG解码

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值