JPG文件格式

JPEG的文件格式

JPEG文件大体上可以分成以下两个部分:标记码(Tag)加压缩数据。先介绍标记码部分。

标记码部分给出了JPEG图象的所有信息(有点类似于BMP中的头信息,但要复杂的多),如图象的宽、高、Huffman表、量化表等等。标记码有很多,但绝大多数的JPEG文件只包含几种。标记码的结构为:

SOI

DQT

             DRI

                    SOF0

                           DHT

                                  SOS

                                  …

                                  EOI

标记码由两个字节组成,高字节为0XFF,每个标记码之前可以填上个数不限的填充字节0XFF

下面介绍一些常用的标记码的结构及其含义。

(1)SOI(Start of Image)

标记结构      字节数

0XFF             1

0XD8             1

可作为JPEG格式的判据(JFIF还需要APP0的配合)

(2)APP0(Application)

标记结构       字节数    意义

0XFF             1

0XE0             1

Lp                 2            APP0标记码长度,不包括前两个字节0XFF0XE0

Identifier 5            JFIF识别码 0X4A0X460X490X460X00

Version           2            JFIF版本号 可为0X0101或者0X0102

Units              1            单位,等于零时表示未指定,为1表示英寸,为2表示

厘米

Xdensity  2            水平分辨率

Ydensity  2            垂直分辨率

Xthumbnail     1            水平点数

Ythumbnail     1            垂直点数

RGB0             3            RGB的值

RGB1             3            RGB的值

RGBn             3            RGB的值,n=Xthumbnail*Ythumbnail

APP0JPEG保留给Application所使用的标记码,而JFIF将文件的相关信息定义在此标记中。

(3)DQT(Define Quantization Table)

标记结构       字节数    意义

0XFF             1

0XDB            1

Lq                 2            DQT标记码长度,不包括前两个字节0XFF0XDB

(Pq,Tq)          1            高四位Pq为量化表的数据精确度,Pq=0时,Q0~Qn

值为8位,Pq=1时,Qt的值为16位,Tq表示量化表的

编号,为0~3。在基本系统中,Pq=0Tq=0~1,也就是

说最多有两个量化表。

Q0                 12      量化表的值,Pq=0时;为一个字节,Pq=1时,为两个

字节

Q1                 12      量化表的值,Pq=0时;为一个字节,Pq=1时,为两个

字节

Qn                 12      量化表的值,Pq=0时,为一个字节;Pq=1时,为两个

字节。n的值为0~63,表示量化表中64个值(之字形排

)

(4)DRI(Define Restart Interval)

此标记需要用到最小编码单元(MCUMinimum Coding Unit)的概念。前面提到,Y分量数据重要,UV分量的数据相对不重要,所以可以只取UV的一部分,以增加压缩比。目前支持JPEG格式的软件通常提供两种取样方式YUV411YUV422,其含义是YUV三个分量的数据取样比例。举例来说,如果Y取四个数据单元,即水平取样因子Hy乘以垂直取样因子Vy的值为4,而UV各取一个数据单元,即Hu×Vu=1,Hv×Vv=1。那么这种部分取样就称为YUV411。如图9.7所示:

9.7     YUV411的示意图

9.8     YUV111的排列顺序

易知YUV41150%的压缩比(原来有12个数据单元,现在有6个数据单元)YUV42233%的压缩比(原来有12个数据单元,现在有8个数据单元)

那么你可能会想,YUV911YUV1611压缩比不是更高嘛?但是要考虑到图象质量的因素。所以JPEG标准规定了最小编码单元MCU,要求Hy×Vy+Hu×Vu+Hv×Vv10

MCU中块的排列方式与HV的值有密切关系,如图9.8、图9.9、图9.10所示。

9.9     YUV211的排列顺序

9.10   YUV411的排列顺序

标记结构       字节数    意义

0XFF             1

0XDD            1

Lr                  2            DRI标记码长度,不包括前两个字节0XFF0XDD

Ri                 2            重入间隔的MCU个数,Ri必须是一MCU行中MCU

个数的整数,最后一个零头不一定刚好是RiMCU

每个重入间隔各自独立编码。

(5)SOF(Start of Frame) 在基本系统中,只处理SOF0

标记结构       字节数    意义

0XFF             1

0XC0             1

Lf                  2            SOF标记码长度,不包括前两个字节0XFF0XC0

P                   1            基本系统中,为0X08

Y                   2            图象高度

X                   2            图象宽度

Nf                 1            Frame中的成分个数,一般为131代表灰度图,3

代表真彩图

C1                 1            成分编号1

(H1,V1)   1            第一个水平和垂直采样因子

Tq1        1            该量化表编号

C2                 1            成分编号2

(H2,V2)   1            第二个水平和垂直采样因子

Tq2        1            该量化表编号

Cn                 1            成分编号n

(Hn,Vn)   1            n个水平和垂直采样因子

Tqn        1            该量化表编号

(6)DHT(Define Huffman Table)

标记结构       字节数    意义

0XFF             1

0XC4             1

Lh                 2            DHT标记码长度,不包括前两个字节0XFF0XC4

(Tc,Th)          1           

L1                 1

L2                 1

…                 

L16         1

V1                 1

V2                 1

Vt                  1

Tc为高4位,Th为低4位。在基本系统中,Tc01,为0时,指DC所用的Huffman表,为1时,指AC所用的Huffman表。Th表示Huffman表的编号,在基本系统中,其值为01。所以,在基本系统中,最多有4Huffman表,如下所示:

Tc   Th   Huffman表编号(2×Tc+Th)

0     0

1     1

0     2

1     1     3

Ln表示每个n比特的Huffman码字的个数,n=1~16

Vt表示每个Huffman码字所对应的值,也就是我们前面所讲的符号1,对DC来说该值为(Size),对AC来说该值为(RunLengthSize)

t=L1+L2+…L16

(7)SOS(Start of Scan)

标记结构       字节数    意义

0XFF             1

0XDA            1

Ls                  2            DHT标记码长度,不包括前两个字节0XFF0XDA

Ns                 1

Cs1         1

(Td1,Ta1)       1

Cs2         1

(Td2,Ta2)       1

CsNs             1

(TdNs,TaNs)  1

Ss                  1

Se                  1

(AhAl) 1

NsScan中成分的个数,在基本系统中,Ns=Nf(Frame中成分个数)CSNs为在Scan中成分的编号。TdNs为高4位,TaNs为低4位,分别表示DCAC编码表的编号。在基本系统中Ss=0Se=63Ah=0Al=0

(8)EOI(End of Image)   结束标志

标记结构       字节数    意义

0XFF             1

0XD9             1

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值