JFIF-JPEG文件

JFIF文件

一.            简介

微处理机中的数据存放顺序有大端(big endian)小端(little endian)之分。大端顺序是指高字节数据存放在低地址处,低字节数据存放在高地址处,而小端顺序是指低字节数据存放在内存低地址处,高字节数据存放在内存高地址处。例如,十六进制数为A02B,按大端顺序存放就是A02B,按小端顺序存放就是2BA0。摩托罗拉(Motorola)公司的微处理器使用大端顺序存放,而英特尔(Intel)公司的微处理器使用小端顺序。JPEG文件中的字节是按照大端顺序排列的。

JPEG委员会在制定JPEG标准时,定义了许多标记(marker)用来区分和识别图像数据及其相关信息,但笔者没有找到JPEG委员会对JPEG文件交换格式的明确定义。直到199812月从分析网上具体的JPG图像来看,使用比较广泛的还是JPEG文件交换格式(JPEG File Interchange FormatJFIF)版本号为1.02。这是19929月由在C-Cube Microsystems公司工作的Eric Hamilton提出的。此外还有TIFF JPEG等格式,但由于这种格式比较复杂,因此大多数应用程序都支持JFIF文件交换格式。

JPEG文件使用的颜色空间是YCbCr空间。在JFIF文件格式中,图像样本的存放顺序是从左到右和从上到下。这就是说JFIF文件中的第一个图像样本是图像左上角的样本。

二.            文件结构

JFIF文件格式直接使用JPEG标准为应用程序定义的许多标记,因此JFIF格式成了事实上JPEG文件交换格式标准。JPEG的每个标记都是由2个字节组成,其前一个字节是固定值0xFF每个标记之前还可以添加数目不限的0xFF填充字节(fill byte)。下面是其中的8个标记:

  1. SOI  0xD8            图像开始
  2. APP0 0xE0            JFIF应用数据块
  3. APPn 0xE1 - 0xEF    其他的应用数据块(n, 115)
  4. DQT  0xDB           量化表
  5. SOF0 0xC0            帧开始
  6. DHT  0xC4           霍夫曼(Huffman)
  7. SOS  0xDA           扫描线开始
  8. EOI  0xD9            图像结束

为使读者对JPEG定义的标记一目了然,现将JPEG的标记码列于表6-05,并保留英文解释。

6-05 JPEG定义的标记

Symbol

(符号)

Code Assignment

(标记代码)

Description

(说明)

Start Of Frame markers, non-hierarchical Huffman coding

SOF0

0xFFC0

Baseline DCT

SOF1

0xFFC1

Extended sequential DCT

SOF2

0xFFC2

Progressive DCT

SOF3

0xFFC3

Spatial (sequential) lossless

Start Of Frame markers, hierarchical Huffman coding

SOF5

0xFFC5

Differential sequential DCT

SOF6

0xFFC6

Differential progressive DCT

SOF7

0xFFC7

Differential spatial lossless

Start Of Frame markers, non-hierarchical arithmetic coding

JPG

0xFFC8

Reserved for JPEG extensions

SOF9

0xFFC9

Extended sequential DCT

SOF10

0xFFCA

Progressive DCT

SOF11

0xFFCB

Spatial (sequential) Lossless

Start Of Frame markers, hierarchical arithmetic coding

SOF13

0xFFCD

Differential sequential DCT

SOF14

0xFFCE

Differential progressive DCT

SOF15

0xFFCF

Differential spatial Lossless

Huffman table specification

DHT

0xFFC4

Define Huffman table(s)

arithmetic coding conditioning specification

DAC

0xFFCC

Define arithmetic conditioning table

Restart interval termination

RSTm

0xFFD00xFFD7

Restart with modulo 8 counter m

Other marker

SOI

0xFFD8

Start of image

EOI

0xFFD9

End of image

SOS

0xFFDA

Start of scan

DQT

0xFFDB

Define quantization table(s)

DNL

0xFFDC

Define number of lines

DRI

0xFFDD

Define restart interval

DHP

0xFFDE

Define hierarchical progression

EXP

0xFFDF

Expand reference image(s)

APPn

0xFFE00xFFEF

Reserved for application use

JPGn

0xFFF00xFFFD

Reserved for JPEG extension

COM

0xFFFE

Comment

Reserved markers

TEM

0xFF01

For temporary use in arithmetic coding

RES

0xFF020xFFBF

Reserved

 

 

 

 

一般的JFIF文件由下面的9个部分组成:(字段偏移量字段长度(若未说明“长度不定”则表明在任何情况下长度均为所写的值) 字段内容(若未说明“内容不定”则在任何情况下内容均为所写的值,为方便表示还可以把内容设为某值)),

 

( 1 ) 图像开始SOI(Start of Image)标记

 

0h 2字节 0xFFD8

 

( 2 )       APP0标记(Marker)

 

0h 2字节 0xFFE0

 

      APP0长度(length)(①~⑨九个字段的总长度)

 

2h 2字节 内容不定(①~⑨九个字段的总长度)

 

      标识符(identifier)

 

4h 5字节 0x4A46494600 即“JFIF0

 

      版本号(version)

 

9h 2字节 0x0102 JFIF的版本号目前基本上都是1.2

 

      XY的密度单位(units=0:无单位;units=1:点数/英寸;units=2:点数/厘米)

 

bh 1字节 只有012三个值可选,其分别代表的意义如上]

 

      X方向像素密度(X density)

 

ch 2字节 取值范围未知

 

      Y方向像素密度(Y density)

 

eh 2字节 取值范围未知

 

      缩略图水平像素数目(thumbnail horizontal pixels)

 

10h 1字节 取值范围未知

 

      缩略图垂直像素数目(thumbnail vertical pixels)

 

11h 1字节 取值范围未知

 

      缩略图RGB位图(thumbnail RGB bitmap)

 

                        12h 长度可能是3的倍数 内容不定

 

    本段(APP0)可以包含图像的一个微缩版本,存为24位的RGB像素。如果没有微缩图像(这种情况更常见),则⑦“缩略图水平像素数目”和⑧“缩略图垂直像素数目”的值均为0

 

( 3 )       APPn标记(Markers),其中n=115(任选)

 

      APPn长度(length)(①②两个字段的总长度)

 

      详细信息(application specific information)

 

对每个APP

 

若为APPNN1F(以16进制表示,N任选其中一个))

 

·   标记: mh 2字节 0xFFEN

 

·   长度:(m+2)h 2字节 内容不定(设为n10进制))(本字段与下一字段的总长度)

 

·   详细信息: (m+4)h n2字节(即长度减2)内容不定

 

( 4 )       一个或者多个量化表DQT(Difine Quantization Table)

 

       0h 2字节 0xFFDB

 

      量化表长度(quantization table length)(①~②两个字段的总长度)

 

2h 2字节 内容不定(①~②两个字段的总长度)

 

      量化表(quantization table)

 

A.      P/T(高四位:精度,低四位:表ID)

 

B.      表项

 

对每个量化表:

 

·  P/T(高四位:精度,低四位:表ID)  mh 1字节 精度, 0 表示 8 bit, 1表示 16 bitID取值范围为03, 否则错误

 

·  表项    (m+1)h (64×(精度+1))字节 内容长,故略

 

( 5 )       帧图像开始SOF0(Start of Frame)

 

       0h 2字节 0xFFC0

 

      帧开始长度(start of frame length) (①~⑥六个字段的总长度)

 

2h 2字节 内容不定(①~⑥六个字段的总长度)

 

      精度(precision),每个颜色分量每个像素的位数(bits per pixel per color component)

 

4h 1字节 每个样本位数, 通常是 8 (大多数软件不支持 12 16)

 

      图像高度(image height)  5h 2字节 内容不定(如果不支持 DNL 就必须 >0

 

      图像宽度(image width)   7h 2字节 内容不定(如果不支持 DNL 就必须 >0

 

      颜色分量数(number of color components)

 

9h 1字节 内容不定(灰度图是 1, YCbCr/YIQ 彩色图是 3, CMYK 彩色图是 4,我们这里讨论的JFIF使用的是YCbCr,故这里颜色分量数为3

 

      对每个颜色分量(for each component)

 

A.      ID

 

B.      垂直方向的样本因子(vertical sample factor)

 

C.      水平方向的样本因子(horizontal sample factor) BC共占用1字节,B占用低4位,C占用高4位)

 

D.      量化表号(quantization table#)

 

JFIF格式使用的是YCbCr所以有3个分量(这里特别要注意的是颜色分量的ID号是有含义的,1代表Y2代表Cb3代表Cr4代表I5代表Q):

 

1)       ID

    ah 1字节 0x01

(高四位)水平(低四位)垂直样本因子

    bh 1字节 0x227

量化表号

    ch 1字节 内容不定(本分量使用的量化表的ID号)

 

2)       ID

    dh 1字节 0x02

(高四位)水平(低四位)垂直样本因子

    eh 1字节 0x11J

量化表号

    fh 1字节 内容不定(本分量使用的量化表的ID号)

 

3)       ID

    10h 1字节 0x03

(高四位)水平(低四位)垂直样本因子

    11h 1字节 0x11

量化表号

    12h 1字节 内容不定(本分量使用的量化表的ID号)

 

( 6 )       一个或者多个霍夫曼表DHT(Difine Huffman Table)

 

       0h 2字节 0xFFC4

 

      霍夫曼表的长度(Huffman table length) (①~②两个字段的总长度)

 

2h 2字节 内容不定(①~②两个字段的总长度)

 

      对每个霍夫曼表(一般情况下,霍夫曼表不止一个,但是绝对不多于4)

 

A.      表号

 

B.      类型:AC或者DC(其中0DC表,1AC)AB共占用1字节,A占用低4位,B占用高4位)

 

C.      16个字节的编码,其代码代数和为接下来的编码的长度

 

D.      内容编码

 

对每个霍夫曼表:

 

· (高四位)类型和(低四位)表号: mh 1字节 内容不定(有四个可能:0x00表示第0DC表,0x01表示第1DC表,0x10表示第0AC表,0x11表示第1AC表)

 

·  16个字节的编码: (m+1)h 16字节 内容不定(设这16个字节上数据之和为n

 

·  内容编码: (m+17)h  n字节 内容长,故略)

 

( 7 )       定义重新开始间隔DRI(Difine Restart Interval)

 

    (在没有DRI标记,或间隔为零时,就不存在重新开始间隔和重开始标记)

 

        0h 2字节 0xFFDD

 

     长度  2h 2字节 0x0004(①~②两个字段的总长度)

 

     MCU 块的单元中的重新开始间隔

 

4h 2字节 内容不定(设为n,则意思是说,每nMCU块就有一个RSTn标记。第一个标记是RST0,然后是RST1等,RST7后再从RST0重复)

 

( 8 )       扫描开始SOS(Start of Scan)

 

       0h 2字节 0xFFDA

 

      扫描开始长度(start of scan length)

 

2h 2字节 内容不定(①~③再加上④的A/B/C的总长度)

 

      颜色分量数(number of color components)

 

4h 1字节 应该和⑸⑤的值相同(灰度图是1, YCbCr/YIQ 彩色图是3, CMYK 彩色图是4

 

      每个颜色分量

 

A.      ID

 

B.      交流系数表号(AC table #)

 

C.      直流系数表号(DC table #)

 

BC共占用1字节,B:占用低4位,C:占用高4位)

 

由②得到这里的颜色分量数为3(这里的颜色分量的ID号的含义和⑸⑥的一样,1代表Y2代表Cb3代表Cr4代表I5代表Q):

 

1   ID

5h 1字节 0x01 (高四位)直流(低四位)交流数表号

6h 1字节 0x00

 

2   ID

7h 1字节 0x027 (高四位)直流(低四位)交流数表号

8h 1字节 0x11

 

3   ID

9h 1字节 0x03  (高四位)直流(低四位)交流数表号

ah 1字节 0x11

 

      压缩图像数据(compressed image data)

 

A.      谱选择开始   bh 1字节 0x00

 

B.      谱选择结束   ch 1字节 0x3F

 

C.      两个4位字段,高位和低位的谱选择  dh 1字节 在基本JPEG中总为0x00

 

D.      数据   eh 长度不定内容长,故略

 

( 9 )       图像结束EOI(End of Image)

 

     0h 2字节 0xFFD9

 

 

 

6-06表示了APP0域的详细结构。

6-06 JFIF格式中APP0域的详细结构

偏移

长度

内容

块的名称

说明

0

2 byte

0xFFD8

(Start of Image,SOI)

图像开始

2

2 byte

0xFFE0

APP0(JFIF application segment)

JFIF应用数据块

4

2 bytes

 

length of APP0 block

APP0块的长度

6

5 bytes

 

"JFIF"+"0"

识别APP0标记

11

1 byte

 

<Major version>

主要版本号(如版本1.02中的1)

12

1 byte

 

<Minor version>

次要版本号(如版本1.02中的02)

13

1 byte

 

<Units for the X
and Y densities>

XY的密度单位

units=0:无单位

units=1:点数/英寸

units=2:点数/厘米

14

2 bytes

 

<Xdensity>

水平方向像素密度

16

2 bytes

 

<Ydensity>

垂直方向像素密度

18

1 byte

 

<Xthumbnail>

缩略图水平像素数目

19

1 byte

 

<Ythumbnail>

缩略图垂直像素数目

 

3n

 

< Thumbnail RGB bitmap>

缩略RGB位图(n为缩略图的像素数)

 

 

 

Optional JFIF extension APP0 marker segment(s)

任选的JFIF扩展APP0标记段

 

……

 

……

 

 

2 byte

0xFFD9

(EOI) end-of-file

图像文件结束标记

 

 

 

 

 

 

 

另:JPEG定义的标记(中文版)

标记名

标记代码

说明

帧开始标记,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

 

你可能感兴趣的:(image,table,application,byte,Motorola,Components)