JPEG文件格式介紹


JPEG文件的存儲格式有很多種,但最常用的是JFIF格式,即JPEG File Interchange FormatJPEG文件大體可以分為兩個部分:

(1)標記碼;由兩個字節構成,其中,前一個字節是固定值0XFF代表了一個標記碼的開始,后一個字節不同的值代表着不同的含義。需要提醒的是,連續的多個0XFF可以理解為一個0XFF,並表示一個標記碼的開始。另外,標記碼在文件中一般是以標記代碼的形式出現的。例如,SOI的標記代碼是0XFFD8,即,如果JPEG文件中出現了0XFFD8,則代表此處是一個SOI標記。

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

一些典型的標記碼,及其所代表的含義如下所示:

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

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

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

(2)標示符:5個字節,固定值0X4A6494600,表示了字符串“JFIF0”;

(3)版本號:2個字節,一般為0X0102,表示JFIF的版本號為1.2;但也可能為其它數值,從而代表了其它版本號;

(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進制搜索功能可找到各部分的起始 位置,在嵌入式系統中可用類似的數值匹配法定位。

 

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

 

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

 

1、APP0長度(length)                            2byte

 

2、標識符(identifier)                     5byte

 

3、版本號(version)                        2byte

 

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

 

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

 

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

 

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

 

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

 

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

 

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

 

1、APPn長度(length)

 

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

 

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

 

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

 

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

 

3、量化表(quantization table)

 

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

 

1、幀開始長度(start of frame length)

 

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

 

3、圖像高度(image height)

 

4、圖像寬度(image width)

 

5、顏色分量數(number of color components)

 

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

 

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

 

六、一個或者多個霍夫曼表DHT(Difine Huffman Table),數值0xC4

 

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

 

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

 

3、索引(Index)

 

4、位表(bits table)

 

5、值表(value table)

 

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

 

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

 

2、顏色分量數(number of color components)

 

3、每個顏色分量

 

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

 

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

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


免責聲明!

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



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