JPEG文件格式介紹

JPEG文件的存儲格式有不少種,但最經常使用的是JFIF格式,即JPEG File Interchange FormatJPEG文件大致能夠分爲兩個部分:app

(1)標記碼;由兩個字節構成,其中,前一個字節是固定值0XFF表明了一個標記碼的開始,後一個字節不一樣的值表明着不一樣的含義。須要提醒的是,連續的多個0XFF能夠理解爲一個0XFF,並表示一個標記碼的開始。另外,標記碼在文件中通常是以標記代碼的形式出現的。例如,SOI的標記代碼是0XFFD8,即,若是JPEG文件中出現了0XFFD8,則表明此處是一個SOI標記。ide

(2)壓縮數據;一個完整的兩字節標記碼的後面,就是該標記碼對應的壓縮數據了,它記錄了關於文件的若干信息。函數

一些典型的標記碼,及其所表明的含義以下所示:編碼

SOIStart Of Image, 圖像開始,標記代碼爲固定值0XFFD8,用2字節表示;spa

APP0Application 0, 應用程序保留標記0,標記代碼爲固定值0XFFE0,用2字節表示;該標記碼以後包含了9個具體的字段:component

(1)數據長度:2個字節,用來表示(1--9)的9個字段的總長度,即不包含標記代碼但包含本字段;orm

(2)標示符:5個字節,固定值0X4A6494600,表示了字符串「JFIF0」;索引

(3)版本號:2個字節,通常爲0X0102,表示JFIF的版本號爲1.2;但也可能爲其它數值,從而表明了其它版本號;ci

(4)X,Y方向的密度單位:1個字節,只有三個值可選,0:無單位;1:點數每英寸;2:點數每釐米;字符串

(5)X方向像素密度:2個字節,取值範圍未知;

(6)Y方向像素密度:2個字節,取值範圍未知;

(7)縮略圖水平像素數目:1個字節,取值範圍未知;

(8)縮略圖垂直像素數目:1個字節,取值範圍未知;

(9)縮略圖RGB位圖:長度多是3的倍數,保存了一個24位的RGB位圖;若是沒有縮略位圖(這種狀況更常見),則字段(7)(8)的取值均爲0

APPn, Application n, 應用程序保留標記n(n=1---15),標記代碼爲2個字節,取值爲0XFFE1--0XFFFF;包含了兩個字段:

(1)數據長度,2個字節,表示(1)(2)兩個字段的總長度;即,不包含標記代碼,但包含本字段;

(2)詳細信息:數據長度-2個字節,內容不定;

DQTDefine Quantization Table, 定義量化表;標記代碼爲固定值0XFFDB;包含9個具體字段:

(1)數據長度:2個字節,表示(1)和多個(2)字段的總長度;即,不包含標記代碼,但包含本字段;

(2)量化表:數據長度-2個字節,其中包括如下內容:

a)精度及量化表ID1個字節,高4位表示精度,只有兩個可選值,08位;1:16位;低4位表示量化表ID,取值範圍爲0--3

b)表項,64*(精度取值+1)個字節,例如,8位精度的量化表,其表項長度爲64*0+1=64字節;

本標記段中,(2)能夠重複出現,表示多個量化表,但最多隻能出現4次;

SOFOStart Of Frame, 幀圖像開始,標記代碼爲固定值0XFFC0;包含9個具體字段:

(1)數據長度:2個字節,(1--6)共6個字段的總長度;即,不包含標記代碼,但包含本字段;

(2)精度:1個字節,表明每一個數據樣本的位數;一般是8位;

(3)圖像高度:2個字節,表示以像素爲單位的圖像高度,若是不支持DNL就必須大於0

(4)圖像寬度:2個字節,表示以像素爲單位的圖像寬度,若是不支持DNL就必須大於0

(5)顏色份量個數:1個字節,因爲JPEG採用YCrCb顏色空間,這裏恆定爲3

(6)顏色份量信息:顏色份量個數*3個字節,這裏一般爲9個字節;並依此表示以下一些信息:

a)顏色份量ID: 1個字節;

b)水平/垂直採樣因子:1個字節,高4位表明水平採樣因子,低4位表明垂直採樣因子;

c)量化表:1個字節,當前份量使用的量化表ID

本標記段中,字段(6)應該重複出現3次,由於這裏有3個顏色份量;

DHTDefine Huffman Table定義Huffman表,標記碼爲0XFFC4;包含2個字段:

(1)數據長度,2個字節,表示(1--2)的總長度,即,不包含標記代碼,但包含本字段;

(2)Huffman表,數據長度-2個字節,包含如下字段:

(a)ID和表類型,1個字節,高4位表示表的類型,取值只有兩個;0DC直流;1AC交流;低4位,HuffmanID;須要提醒的是,DC表和AC表分開進行編碼;

(b)不一樣位數的碼字數量,16個字節;

(c)編碼內容,16個不一樣位數的碼字數量之和(字節);

本標記段中,字段(2)能夠重複出現,通常須要重複4次。

DRIDefine Restart Interval,定義差分編碼累計復位的間隔,標記碼爲固定值0XFFDD

包含2個具體字段:

(1)數據長度:2個字節,取值爲固定值0X0004,表示(1)(2)兩個字段的總長度;即,不包含標記代碼,但包含本字段;

(2)MCU塊的單元中從新開始間隔:2個字節,若是取值爲n,就表明每nMCU塊就有一個RSTn標記;第一個標記是RST0,第二個是RST1,RST7以後再從RST0開始重複;若是沒有本標記段,或者間隔值爲0,就表示不存在重開始間隔和標記RST

SOSStart Of Scan,掃描開始;標記碼爲0XFFDA,包含2個具體字段:

(1)數據長度:2個字節,表示(1--4)字段的總長度;

(2)顏色份量數目:1個字節,只有3個可選值,1:灰度圖;3YCrCbYIQ4CMYK

(3)顏色份量信息:包括如下字段,

a)顏色份量ID1個字節;

b)直流/交流係數表ID1個字節,高4位表示直流份量的Huffman表的ID;低4位表示交流份量的Huffman表的ID

(4)壓縮圖像數據

a)譜選擇開始:1個字節,固定值0X00

b)譜選擇結束:1個字節,固定值0X3F

c)譜選擇:1個字節,固定值0X00

本標記段中,(3)應該重複出現,有多少個顏色份量,就重複出現幾回;本段結束以後,就是真正的圖像信息了;圖像信息直到遇到EOI標記就結束了;

EOIEnd Of Image,圖像結束;標記代碼爲0XFFD9

另外,須要說明的是,在JPEG0XFF具備標記的意思,因此在壓縮數據流(真正的圖像信息)中,若是出現了0XFF,就須要作特別處理了。方法是,若是在圖像數據流中遇到0XFF,應該檢測其緊接着的字符,若是是:

10X00,表示0XFF是圖像流的組成部分;須要進行譯碼;

20XD9,表示與0XFF組成標記EOI,即,表明圖像流的結束,同時,圖像文件結束;

30XD0--0XD7,組成RSTn標記,須要忽視整個RSTn標記,即不對當前0XFF和緊接着的0XDn兩個字節進行譯碼,並按RST標記的規則調整譯碼變量;

40XFF,忽略當前0XFF,對後一個0XFF進行判斷;

(5)其它數值,突然當前0XFF,並保留緊接着此數值用於譯碼;

須要說明的是,JPEG文件格式中,一個字(16位)的存儲使用的是Motorola格式,而不是Intel格式。也就是說,一個字的高字節(高8位)在數據流的前面,低字節(低8位)在數據流的後面,與平時習慣的Intel格式有所不一樣。這種字節順序問題的原由在於早期的硬件發展上。在8CPU的時代,許多8CPU均可以處理16位的數據,但它們顯然是分兩次進行處理的。這個時候就出現了先處理高位字節仍是先處理低位字節的問題。以Intel爲表明的廠家生產的CPU採用先低字節後高字節的方式;而以Motorola,IBM爲表明的廠家生產的CPU則採用了先高字節後低字節的方式。Intel的字節順序也稱爲little-endian,而Motorola的字節順序就叫作big-endian。而JPEG/JFIF文件格式則採用了big-endian格式。下面的函數,實現了從intel格式到motolora格式的轉換
USHORT Intel2Moto(USHORT val)
 {
  BYTE highBits = BYTE(val / 256);
  BYTE lowBits = BYTE(val % 256);
  return lowBits * 256 + highBits;
 }

 

__________________________________________________

 

 

 JPEG文件由八個部分組成,每一個部分的標記字節爲兩個,首字節固定爲:0xFF,固然,準 許在其前面再填充多個0xFF,以最後一個爲準。下面爲各部分的名稱和第二個標記字節的數值,用ultraedit的16進制搜索功能可找到各部分的起始 位置,在嵌入式系統中可用相似的數值匹配法定位。

 

1、圖像開始SOI(Start of Image)標記,數值0xD8

 

2、APP0標記(Marker),數值0xE0

 

一、APP0長度(length)                            2byte

 

二、標識符(identifier)                     5byte

 

三、版本號(version)                        2byte

 

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

 

五、X方向像素密度(X density)                      2byte

 

六、Y方向像素密度(Y density)                       2byte

 

七、縮略圖水平像素數目(thumbnail horizontal pixels)                       1byte

 

八、縮略圖垂直像素數目(thumbnail vertical pixels)                            1byte

 

九、縮略圖RGB位圖(thumbnail RGB bitmap),由前面的數值決定,取值3n,n爲縮略圖總像素   3n byte

 

3、APPn標記(Markers),其中n=1~15,數值對應0xE1~0xEF   

 

一、APPn長度(length)

 

二、應用細節信息(application specific information)

 

4、一個或者多個量化表DQT(difine quantization table),數值0xDB

 

一、量化表長度(quantization table length)

 

二、量化表數目(quantization table number)

 

三、量化表(quantization table)

 

5、幀圖像開始SOF0(Start of Frame),數值0xC0

 

一、幀開始長度(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),數值0xC4

 

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

 

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

 

三、索引(Index)

 

四、位表(bits table)

 

五、值表(value table)

 

7、掃描開始SOS(Start of Scan),數值0xDA

 

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

 

二、顏色份量數(number of color components)

 

三、每一個顏色份量

 

包括:ID、交流係數表號(AC table #)、直流係數表號(DC table #)

 

四、壓縮圖像數據(compressed image data)

8、圖像結束EOI(End of Image),數值0xD9

相關文章
相關標籤/搜索