JPEG頭部解析


6.3 JPEG格式

      6.3.1簡介 

      微處理機中的存放順序有正序(big endian)和逆序(little endian)之分。正序存放就是高字節存放在前低字節在后,而逆序存放就是低字節在前高字節在后。例如,十六進制數為A02B,正序存放就是A02B,逆序存放就是2BA0。摩托羅拉(Motorola)公司的微處理器使用正序存放,而英特爾(Intel)公司的微處理器使用逆序。JPEG文件中的字節是按照正序排列的。

      JPEG委員會在制定JPEG標准時,定義了許多標記(marker)用來區分和識別圖像數據及其相關信息,但筆者沒有找到JPEG委員會對JPEG文件交換格式的明確定義。直到1998年12月從分析網上具體的JPG圖像來看,使用比較廣泛的還是JPEG文件交換格式(JPEG File Interchange Format,JFIF)本號為1.02。這是1992年9月由在C-Cube Microsystems公司工作的Eric Hamilton提出的。此外還有TIFF JPEG等格式,但由於這種格式比較復雜,因此大多數應用程序都支持JFIF文件交換格式。

JPEG文件使用的顏色空間是CCIR 601推薦標准進行的彩色空間(參看第7章)。在這個彩色空間中,每個分量、每個像素的電平規定為255級,用8位代碼表示。從RGB轉換成YCbCr空間時,使用下面的精確的轉換關系:

      Y = 256 * E'y

      Cb = 256 * [E'Cb] + 128

      Cr = 256 * [E'Cr] + 128
其中亮度電平E'y和色差電平E'Cb和E'Cb分別是CCIR 601定義的參數。由於E'y的范圍是0~1,E'Cb和E'Cb的范圍是-0.5~+0.5,因此Y, Cb和Cr的最大值必須要箝到255。於是RGB和YCbCr之間的轉換關系需要按照下面的方法計算。

(1) 從RGB轉換成YCbCr

YCbCr(256級)分量可直接從用8位表示的RGB分量計算得到:

       Y =   0.299 R + 0.587 G  + 0.114 B

     Cb = - 0.1687R - 0.3313G  + 0.5   B + 128

    Cr = 0.5 R - 0.4187G - 0.0813 B + 128

需要注意的是不是所有圖像文件格式都按照R0,G0,B0,…… Rn,Gn,Bn的次序存儲樣本數據,因此在RGB文件轉換成JFIF文件時需要首先驗證RGB的次序。

(2) 從YCbCr轉換成RGB

RGB分量可直接從YCbCr(256級)分量計算得到:

     R = Y                 + 1.402 (Cr-128)

      G = Y - 0.34414 (Cb-128) - 0.71414 (Cr-128)

      B = Y + 1.772 (Cb-128)

在JFIF文件格式中,圖像樣本的存放順序是從左到右和從上到下。這就是說JFIF文件中的第一個圖像樣本是圖像左上角的樣本。

6.3.2文件結構

  學習這些標記最好就是用UltraEdit編輯工具打開一個.jpg或.jpeg文件,參照着格式去分析,加深對這些格式的理解。

     JFIF文件格式直接使用JPEG標准為應用程序定義的許多標記,因此JFIF格式成了事實上JPEG文件交換格式標准。JPEG的每個標記都是由2個字節組成,其前一個字節是固定值0xFF。每個標記之前還可以添加數目不限的0xFF填充字節(fill byte)。下面是其中的8個標記:

  1. SOI  0xD8            圖像開始
  2. APP0 0xE0            JFIF應用數據塊
  3. APPn 0xE1 - 0xEF    其他的應用數據塊(n, 1~15)
  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

0xFFD0~0xFFD7

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

0xFFE0~0xFFEF

Reserved for application use

JPGn

0xFFF0~0xFFFD

Reserved for JPEG extension

COM

0xFFFE

Comment

Reserved markers

TEM

0xFF01

For temporary use in arithmetic coding

RES

0xFF02~0xFFBF

Reserved

 

JPEG文件由下面的8個部分組成:

(1) 圖像開始SOI(Start of Image)標記

(2) APP0標記(Marker)

① APP0長度(length)

② 標識符(identifier)

③ 版本號(version)

④ X和Y的密度單位(units=0:無單位;units=1:點數/英寸;units=2:點數/厘米)

⑤ X方向像素密度(X density)

⑥ Y方向像素密度(Y density)

⑦ 縮略圖水平像素數目(thumbnail horizontal pixels)

⑧ 縮略圖垂直像素數目(thumbnail vertical pixels)

⑨ 縮略圖RGB位圖(thumbnail RGB bitmap)

(3) APPn標記(Markers),其中n=1~15(任選)

① APPn長度(length)

② 由於詳細信息(application specific information)

(4) 一個或者多個量化表DQT(difine quantization table)

① 量化表長度(quantization table length)

② 量化表數目(quantization table number)

③ 量化表(quantization table)

(5) 幀圖像開始SOF0(Start of Frame)

① 幀開始長度(start of frame length)

② 精度(precision),每個顏色分量每個像素的位數(bits per pixel per color component)

③ 圖像高度(image height)

④ 圖像寬度(image width)

⑤ 顏色分量數(number of color components)

⑥ 對每個顏色分量(for each component)

    • ID
    • 垂直方向的樣本因子(vertical sample factor)
    • 水平方向的樣本因子(horizontal sample factor)
    • 量化表號(quantization table#)

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

① 霍夫曼表的長度(Huffman table length)

② 類型、AC或者DC(Type, AC or DC)

③ 索引(Index)

④ 位表(bits table)

⑤ 值表(value table)

(7) 掃描開始SOS(Start of Scan)

① 掃描開始長度(start of scan length)

② 顏色分量數(number of color components)

③ 每個顏色分量

    • ID
    • 交流系數表號(AC table #)
    • 直流系數表號(DC table #)

④ 壓縮圖像數據(compressed image data)

(8) 圖像結束EOI(End of Image)

表6-06表示了APP0域的詳細結構。有興趣的讀者可通過UltraEdit或者PC TOOLS等工具軟件打開一個JPG圖像文件,對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>

X和Y的密度單位

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

圖像文件結束標記


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM