JPG-JPEG(JFIF)文件解码—文件结构

转载请注明:转自 http://blog.csdn.net/ymlbright  [email protected]

一、总体结构

JPEG文件使用的数据存储方式有多种。最常用的格式称为JPEG文件交换格式(JPEG File Interchange Format,JFIF)。而JPEG文件大体上由一个个数据段组成,数据段包含:标记码(Tag)、数据长度、数据。

           标记码(Tag)  2 Bytes
        数据长度(大端序) 2Bytes
数据 n-2 Bytes
……
下一个数据段

标记码由两个字节构成,其前一个字节是固定值0xFF,后一个字节则根据不同意义有不同数值。在每个标记码之前还可以添加数目不限的无意义的0xFF填充,也就说连续的多个0xFF可以被理解为一个0xFF,并表示一个标记码的开始。而在一个完整的两字节的标记码后,就是该标记码对应的压缩数据流,记录了关于文件的诸种信息。

常用的标记有SOI、APP0、DQT、SOF0、DHT、DRI、SOS、EOI

注意,SOI等都是标记的名称。在文件中,标记是以标记码形式出现的。例如SOI的标记代码为0xFFD8,即在JPEG文件中的如果出现数据0xFFD8,则表示此处为一个SOI标记。

JPG(JFIF)一般结构
SOI (0xFFD8)
APP0(0xFFE0)
APPn(0xFFEn)
DQT(0xFFDB)
SOFx(0xFFCx)
DHT(0xFFC4)
SOS(0xFFDA)
scanData
EOI(0xFFD9)


二、常用标记码数据段

1.SOI

代表JFIF图像数据的开始

2 Bytes  | 标记码 0xFFD8

2.APP0

应用程序标记 0

2 Bytes          | 标记码 0xFFE0
2 Bytes          | 数据段长度,包含本字段,但不包括标记码
5 Bytes          | 固定值 0x4A46494600,字符串 “JIF0”
1 Bytes          | 版本号
1 Bytes          | 版本号
1 Bytes          | 图像密度单位 (0:无单位 1:点数/英寸 2:点数/厘米)
2 Bytes          | X方向像素密度
2 Bytes          | Y方向像素密度
1 Bytes          | 缩略图水平像素数目
1 Bytes          | 缩略图垂直像素数目
n Bytes          | 缩略图,RGB位图数据

3.APP1

应用程序标记1,TIFF 数据 ,具体可以参考:http://zh.wikipedia.org/wiki/TIFF

2 Bytes          | 标记码 0xFFE1
2 Bytes          | 数据段长度,包含本字段,但不包括标记码
6 Bytes          | 固定值 0x457869660000,字符串 “Exif”
n Bytes          | 标签图像文件格式数据(TIFF)

4.APPn

拓展应用程序标记 2~15, 为其他应用程序保留

2 Bytes          | 标记码 0xFFE1~0xFFFF
2 Bytes          | 数据段长度,包含本字段,但不包括标记码
n Bytes          | 数据内容

5.DQT

量化表,存储了对扫描数据进行量化的 8*8 矩阵。

2 Bytes          | 标记码 0xFFDB
2 Bytes          | 数据段长度,包含本字段,但不包括标记码
———————————————————————————————
4 bits | 精度(0:8位1:16位)
4 bits | 量化表ID,一般有2张,最多4张,取值 0~3
64 Bytes | 表项(当精度为16位时,此字段有 128 Bytes)
———————————————————————————————
双线内部分可以重复出现,根据量化表ID,存储多张量化表

6.SOF0

图像帧开始

2 Bytes          | 标记码 0xFFC0
2 Bytes          | 数据段长度,包含本字段,但不包括标记码
1 Bytes          | 每个数据样本位数,固定值 8
2 Bytes          | 图像高度(像素)
2 Bytes          | 图像宽度(像素)
1 Bytes          | 颜色分量数,JFIF中使用 YCbCr 所以为固定值 3 (1:灰度图 3:YCbCr 4:CMYK)
———————————————————————————————
1 Bytes          | 颜色分量ID
4 bits | 颜色分量水平采样因子
4 bits | 颜色分量垂直采样因子
1 Bytes          | 使用量化表ID
———————————————————————————————
双线内部分将重复出现,依ID对颜色分量中的颜色进行描述

7.DHT

Huffman表,存储了对扫描数据进行压缩的Huffman表,共4张,DC直流2张,AC交流2张。

2 Bytes          | 标记码 0xFFDB
2 Bytes          | 数据段长度,包含本字段,但不包括标记码
———————————————————————————————
4 bits | Huffman表类型(0:DC直流 1:AC交流)
4 bits | Huffman表ID,DC/AC 表分开编码
16 Bytes | 不同位数的码字数量
n Bytes | 编码内容含义
———————————————————————————————
双线内部分可以重复出现,根据表ID及DC/AC,存储多张Huffman表

7.SOS

扫描数据开始

2 Bytes          | 标记码 0xFFDA
2 Bytes          | 数据段长度,包含本字段,但不包括标记码
1 Bytes          | 颜色分量数,JFIF中使用 YCbCr 所以为固定值 3 (1:灰度图 3:YCbCr 4:CMYK)
———————————————————————————————
1 Bytes          | 颜色分量ID
4 bits | DC 直流分量使用的Huffman表ID
4 bits | AC交流分量使用的Huffman表ID
———————————————————————————————
3 Bytes          | 固定值 0x003F00
双线内部分可以重复出现,依ID对颜色分量中的颜色进行描述

8.scanData

图像的压缩数据,为了不与之前的标记码(Tag)混淆,数据中遇到 0xFF 时,需要进行判断:
1. 0xFF00:表示 0xFF 是图像数据的组成部分
2. 0xFFD0~0xFFD7:RSTn标记,遇到标记时,对差分解码变量进行重置(归0)
3. 0xFFD9:图像结束标记,图像压缩数据至此结束

9.EOI

代表JFIF图像数据的结束,即文件结尾

2 Bytes  | 标记码 0xFFD9

注:当图像中出现连续的 0xFF 时,当作一个 0xFF 看待。转载请注明:转自 http://blog.csdn.net/ymlbright  [email protected]

三、其他标记码

标记名

标记代码

说明

帧开始标记,Start of Frame,非层次哈夫曼编码

SOF0

0xFFC0

基线离散余弦变换

SOF1

0xFFC1

扩展顺序离散余弦变换

SOF2

0xFFC2

递进离散余弦变换

SOF3

0xFFC3

空间顺序无损

帧开始标记,Start of Frame,层次哈夫曼编码

SOF5

0xFFC5

差分离散余弦变换

SOF6

0xFFC6

差分层次离散余弦变换

SOF7

0xFFC7

差分空间无损

帧开始标记,Start of Frame,非层次算术编码

JPEG

0xFFC8

为JPEG扩展保留

SOF9

0xFFC9

扩展顺序离散余弦变换

SOF10

0xFFCA

递进离散余弦变换

SOF11

0xFFCB

空间顺序无损

帧开始标记,Start of Frame,层次算术编码

SOF13

0xFFCD

差分离散余弦变换

SOF14

0xFFCE

差分层次离散余弦变换

SOF15

0xFFCF

差分空间无损

其他标记

DHT

0xFFC4

定义哈夫曼树表

DAC

0xFFCC

定义算术编码表

RST0

OxFFD0

差分编码累计复位,共8个

……

……

RST7

OxFFD7

SOI

OxFFD8

图像开始

EOI

OxFFD9

图像结束

SOS

0xFFDA

开始扫描,图像数据开始

DQT

0xFFDB

定义量化表

DNL

0xFFDC

定义线数

DRI

0xFFDD

定义差分编码累计复位的间隔

DHP

0xFFDE

定义层次级数

EXP

0xFFDF

展开参考图像

APP0

0xFFE0

为应用程序保留,共15个

……

……

APP15

0xFFEE

JPG0

0xFFF0

为JPEG扩展保留,共14个

……

……

JPG13

0xFFFD

COM

0xFFFE

注释

TEM

0xFF01

算术编码中作临时之用

RES

0xFF02

保留,共189个

……

……

RES

0xFFBF


上表参考自:http://hi.baidu.com/cat_ng/

你可能感兴趣的:(Notice,JPG,文件结构)