(圖一)JPEG圖檔
這就是這次拿來研究的JPEG圖片了,因為JPEG幾乎是現在網頁上最普遍可見的圖片格式,尋找圖片可說是不費吹灰之力,伸手可得。
在PSPad官網下載該軟體後,就可以檢視該圖檔的16位元格式了,順帶一提,安裝完軟體後我的瀏覽器首頁就被綁架了,讓我不是很喜歡他。
(圖二)FFD8、FFD9
上圖可見,資料的最前端寫著FFD8,最末端則是FFD9,如此顯而易見的事實,讓我們看看規格書怎麼說,「Start of image」、「End of image」,對啦!沒錯,就是圖片的起始和結束這麼簡單。
(圖三)FFE0
接在FFD8之後,我們第二個可以看到的是FFE0,參見規格書的說明:Reserved for application segments,是的!此處就是讓應用程式可以塞入自己家的相關資訊,想起老師上課提到的,用Photoshop修圖後的照片,在這邊就可見端倪了。由此圖可見,有意義的字串為JFIF、Ducky,甚至還看到了Adobe的字串,總之這邊看看就好,順帶一提,JFIF全名為JPEG File Interchange Format,是JPEG的延伸額外標準。
(圖四)FFDB
這邊我們看到了FFDB,記錄量化表的資訊,將原來人類看的比較順眼的量化矩形依照Z字型走向來羅列成這邊的序列。量化,就是JPEG失真的關鍵點了。
(圖五)FFC4
主角登場:FFC4!這邊就是老師多次強調的部份了,這邊可以整理出兩個DC Table及兩個AC Table,以便後面的YUV資料來對應。
首先老師有提到,有些圖片將所有的DC、AC Table資料都放到一個FFC4標籤之後,而有些圖片則可以找到四個FFC4的標籤,以此圖來說,他是屬於前者。
從FFC4後的00B4可知道這段資料的長度為180,而00B4後的00則知道此後的一段資料為DC-0 Table,整理如下:
DC-0 Table
|
|||
Category
|
Code length
|
HuffCode
|
Code word
|
3
|
2
|
0
|
00
|
4
|
2
|
1
|
01
|
2
|
3
|
4
|
100
|
5
|
3
|
5
|
101
|
1
|
4
|
12
|
1100
|
6
|
4
|
13
|
1101
|
0
|
5
|
28
|
11100
|
7
|
5
|
29
|
11101
|
8
|
5
|
30
|
11110
|
9
|
6
|
62
|
111110
|
10
|
7
|
126
|
1111110
|
此段資料之後的下一碼為01,表達從此之後為DC-1 Table,我們一樣把他整理如下:
DC-1 Table
|
|||
Category
|
Code length
|
HuffCode
|
Code word
|
1
|
2
|
0
|
00
|
2
|
2
|
1
|
01
|
3
|
2
|
2
|
10
|
0
|
3
|
6
|
110
|
4
|
4
|
14
|
1110
|
5
|
5
|
30
|
11110
|
6
|
6
|
62
|
111110
|
7
|
7
|
126
|
1111110
|
8
|
8
|
254
|
11111110
|
此段資料之後則為AC-0 Table及AC-1 Table,做法雷同,推導上的意義是一樣的。
(圖六)FFDA
在FFC4該段資料之後緊接著就是FFDA,規格書上寫著:Start of scan,我們可以知道從此處開始,後方就是真正掃描自圖片的編碼,在佐以前述Frame header的資訊,兩相對應,就可以把資料有意義的output出來了。
實際上去查閱JPEG的檔案內容,感覺真的很不一樣,比較如C++那般的高階語言,這次作業像是往影像處理最根本的技術去鑽研,我們當然可以直接用市面上許許多多的影像處理軟體來操作、修改我們的圖片,然而在學術研究上,追根究底的去了解JPEG的檔案內容,對日後的研究發展可以產生很大的作用,畢竟連最根本的東西都弄懂了,馬步紮的穩,練功就好辦的多了!
沒有留言:
張貼留言