1. 程式人生 > >JPEG檔案格式 JFIF & Exif

JPEG檔案格式 JFIF & Exif

JPEG是Joint Photographic Experts Group 的縮寫,正是這個專家組制定了JPEG標準以及其他靜態圖片編解碼標準。Joint(聯合)是指ISO TC97 WG8(計算機與資訊處理技術委員會 第8工作組)和CCITT SGVIII兩個工作組的聯合. 這個專家組在1992年頒佈了第一個JPEG標準, ITU在1992年命名為ITU-T Recommendation T.81,  ISO/IEC在1994年命名為10918-1

注意JPEG標準僅僅說明定義了codec部分, 也就是圖片如何壓縮為位元組流以及重新解碼為圖片的過程. 標準沒有涉及到檔案的儲存格式. 

JPEG標準的附錄B定義了檔案格式"JPEG Interchage Format"(JIF), 不過這個檔案格式很少被用到, 主要是因為Encoders和Decoders完整實現JIF很困難, 此外這個標準還缺少以下幾個方面:

  • Color space定義
  • Component sub-sampling 限制
  • 畫素寬高比

因此其他的JPEG檔案格式標準陸續出現了.1992年頒佈了JPEG File Interchange Format(JFIF),緊接著出現了Exchange image file format(Exif)和ICC color profiles. 這些格式都符合JIF的位元組layout,但是又增加了一些不同的markers.在某種程度上說,JFIF是JIF標準的精簡版本.

Exif JPEG檔案格式主要用在攝像裝置上,攝像產業把Exif作為行業的元資料交換格式.由於Exif標準不支援color profiles,所以大部分軟體影象編輯軟體使用JFIF格式儲存JPEG碼流.

不論是Exif還是JFIF格式,都遵守JPEG interchange format(JIF),他們都是由JPEG marker和compressed data組成的.下面列出了JPEG的所有marker

表1 JPEG 的marker定義

短名 位元組碼 Payload 名稱 Comments
SOI 0xFF, 0xD8 None Start Of Image
SOF0 0xFF, 0xC0 Variable size Start Of Frame 0 Baseline DCT-based JPEG, and specifies the width, height, number of components
SOF2 0xFF, 0xC2 Variable size Start of Frame 2 Progressive DCT-based JPEG
DHT 0xFF, 0xC4 variable size Define Huffman Table(s) Specifies one or more Huffman tables
DQT 0xFF, 0xDB variable size Define Quantization Table(s) Specifies one or more quantization tables
DRI 0xFF, 0xDD 2 bytes Define Restart Interval Specifies the interval between RSTn markers, in macroblocks.This marker is followed by two bytes indicating the fixed size
SOS 0xFF, 0xDA variable size Start of Scan Start of Scan
RSTn 0xFF, 0xDn None Restart Insert every r macroblocks. where r is the restart interval set by a DRI marker.
APPn 0xFF, 0xEn variable size Application-sepcific An Exif JPEG file uses an APP1 marker to store metadata; JFIF JPEG file uses an APP0 marker to store JFIF metadata
COM 0xFF, 0xFE variable Comment Contains a text comment
EOI 0xFF, 0xD9 none End of Image

表2 JPEG Start of Frame marker結構

欄位名稱 長度 Comments
標記程式碼 2 bytes 固定值0xFFC0
資料長度 2 bytes SOF marker長度,包括長度自身但不包含標記程式碼
精度 1 bytes 每個樣本資料的位數,通常是8位,一般軟體都不支援12位和16位
影象高度 2 bytes 影象高度,單位:畫素
影象寬度 2 bytes 影象寬度,單位:畫素
顏色分量數 1 bytes 灰度級1,YCbCr或YIQ 3,CMYK 4
顏色分量資訊 顏色分量數x3 每個顏色分量:1byte分量ID;1 byte水平垂直取樣因子;1 byte 當前分量使用的量化表ID

表3 JPEG  Start of Scan

欄位名成 長度 Comments
標記程式碼 2 bytes 固定值0xFFDA
資料長度 2 bytes SOS marker長度,包括長度自身
顏色分量數 1 bytes 灰度級1, YCbCr或者YIQ 3,  CMDK 4
顏色分量資訊 顏色分量數x3 每個樣色分量:1 byte 顏色分量ID;1 byte直流/交流係數表號
壓縮影象資料 3bytes
1 byte 譜選擇開始 固定為0x00
1 byte 譜選擇結束 固定為0x3f
1 byte 譜選擇 在basic JPEG中總為00

表4 JEPG APP0 應用程式保留標記0

 欄位名稱
欄位長度
 Comments
標記程式碼 marker 2 bytes 固定值0xFF, 0xE0
資料長度 length 2 bytes APP0總長度,不過括marker,但是包括length
識別符號 identifier 5 bytes 固定的字串"JFIF\0"
版本號 version 2 bytes 一般為0x0101或者0x0102
畫素單位 unit 1 bytes 座標單位,0沒有單位; 1 pixel/inch;2 pixel/cm
水平畫素數目 Xdensity 2 bytes
垂直畫素數目 YDensity 2 bytes
縮圖水平畫素數目 1 byte
縮圖垂直畫素數目 1 byte
縮圖RGB點陣圖 3n bytes n = Xthumbnail * Ythumbnail, 這是一個24bits/piexl的RGB點陣圖

表5 APPn 應用程式保留標記

欄位名稱
欄位長度
Comments
標記程式碼 marker 2 bytes 固定值0xFFE1 ~ 0xFFEF, n=1~15
資料長度 length 2 bytes APPn的總長度,不包括marker的2bytes
詳細資訊 (length - 2) bytes 內容是應用特定的,比如Exif使用APP1來存放圖片的metadata,Adobe Photoshop用APP1和APP13兩個標記段分別儲存了一副影象的副本。

表6 DQT Define Quantization Table

欄位名稱 子欄位
欄位長度 Comments
標記程式碼 marker 2 bytes 固定值0xFF, 0xDB
量化表長度 length 2 bytes DQT的總長度,不包括marker的2bytes
量化表 (length-2)bytes
精度及量化表ID 1 bytes 高4位:精度,只有兩個可選值,0 8bits,1 16bits;
低4位:量化表ID,取值範圍為0~3
表項 64*(精度+1) bytes

EOI marker

End of Image, 影象結束marker,一般來說EOI在JPEG檔案的末尾處,但是有的JPEG會在EOI之後新增一些內容。

0xFF在JPEG檔案中具有標記性的含義,後一個位元組則根據不同意義有不同數值,在每個標記碼之前還可以新增書目不限的無意義的0xFF填充,也就是說連續的多個0xFF可以理解為一個0xFF,並表示一個標記碼的開始。

注意由於compressed data(jpeg壓縮資料流)中可能出現0xFF的,為了和marker區分開,就需要特殊處理。具體的做法是在0xFF後新增一個沒有意義的0x00。如果在影象資料流中遇到0xFF,檢測緊接著的字元,處理規則如下:

1) 0x00,則表示0xFF是影象流的組成部分。

2) 0xD9,則與0xFF共同組成EOI標記,影象流結束,同時影象檔案結束。

3) 0xD0~0xD7,則組成RSTn標記,則要忽視真個RSTn標記,即不對當強的0xFF和緊接著的0xDn兩個位元組進行譯碼,並按照RST標記的規則調整譯碼變數。

4) 0xFF,忽視當前的0xFF,對後一個0xFF在做判斷

5) 其他數值,則忽視當前的0xFF,並把緊接著的數值用於譯碼

JFIF - JPEG FILE Interchange Format

JFIF是為了使得JPEG 碼流能夠在廣泛的平臺和應用見進行交換的最小檔案格式.這個最小檔案格式不包括TIFF JPEG標準任何高階特性,以及任何應用特定的檔案格式.這種簡化格式的初衷就是為了方便JPEG壓縮影象的交換.

JFIF語法符合ISO DIS 10918-1附錄B中關於交換檔案語法的定義.此外,JFIF 使用APP0 marker來實現JFIF特定於JIF的部分

JFIF格式檔案的 layout:

0xFF, 0xD8                  SOI, Start of Image
0xFF, 0xE0                  APP0, length, identifies, version, units, Xdensity, YDensity, Xthumbnail, Ythunbnail, (RGB)n
      length                2 bytes: 這個APP0域的長度,包括長度欄位本身的2 bytes,但是不包括APP0 marker自身
     identifier            5 bytes: 0x4A, 0x46, 0x49, 0x46, 0x00. 字串"JFIF" 
      version               2 bytes: 版本號,一般為0x0102 或者0x0101,也就是1.01或者1.02
      units                 1 bytes: 座標的單位,units=0: 沒有單位;units=1: 每英寸一個點;units=2 每釐米一個點
     Xdensity              2 bytes: 水平畫素數
      Ydensity              2 bytes: 垂直畫素數
      Xthumbnail            1 bytes: Thumbnail水平畫素數
      Ythumbnail            1 bytes: Thumbnail垂直畫素數
    (RGB)n               3n bytes: 打包的24bits RGB thumbnail畫素 n = Xthumbnail*Ythumbnail
[可選的JFIF擴充套件APP0 marker段]
...
...
0xFF, 0xCn                     SOFn(Start of Frame), length, frame paramters
...
...
0xFF, 0xD9                     EOI (End of Image)
由此刻見, APP0是JFIF特有的部分

Exif - Exchange Image File Format

這個標準是Camera產業聯合會釋出的,主要目的就是設計一種檔案格式,方便交換照片檔案的metadata

Exif檔案的layout

SOI            0xFF, 0xD8    Start of frame
APP1           0xFF, 0xE1      Exif Attribute Information
APP2           0xFF, 0xE2      Flashpix Externsion data
...
APPz           0xFF, 0xEn
DQT            0xFF, 0xDB
DHT            0xFF, 0xC4
DRI            0xFF, 0xDD
SOF            0xFF, 0xC0(0xFF, 0xC2)
SOS            0xFF, 0xDA
               Compressed Data
EOI            0xFF, 0xD9