說明
1 jpeg是一種壓縮標準,大幅度縮小數據流,jpeg以FF D8開頭,FF D9結束。
2 jpeg圖像由多個maker組成,多個maker+compressed組成了jpeg。
3 jiff是一種在萬維網上進行jpeg傳輸的格式,可以理解是對jpeg圖片的封裝,符合jpeg標準,jiff的maker是app0,記錄了圖像的基本信息,也可能有縮略圖。jiff格式比較老,老式的數碼相機使用此格式。
4 exif新比較新的jpeg封裝格式,exif的maker是app1,記錄了更多的東西,如ISP信息、GPS信息、相機信息,圖像旋轉等等
5 jiff和exif可以共存,很多jpeg圖像都有app0的jiff段和app1的exif段
jpeg文件結構
SOI 0xD8 圖像開始
APP0 0xE0 JFIF應用數據塊
APPn 0xE1 - 0xEF 其他的應用數據塊(n, 1~15)
DQT 0xDB 量化表
SOF0 0xC0 幀開始
DHT 0xC4 霍夫曼(Huffman)表
SOS 0xDA 掃描線開始
EOI 0xD9 圖像結束
jiff和exif的基本樣式
jiff app0標記段
exif app1標記段
SOF標記段
此標記段解析圖像寬高
解析jpeg
1 libjpeg開源庫只能解析jiff格式的jpeg,不過jiff格式比較簡單,我們也可以根據格式自己解析。
2 jhead可以解析exif格式的jpeg,exif標記段比較複雜,信息較多,參考了此開源庫做了解析。
重要段
1 app0和app1 判斷是哪種封裝的jpeg(jiff/exif)
2 解析方向,根據app1中的信息解析,jiff不支持方向
3 解析progressive掃描,通過SOFn判斷是baseline還是progressive掃描