What's In A GIF - Bit by Byte

原文:http://matthewflickinger.com/lab/whatsinagif/bits_and_bytes.asp

 

       我們將開始漫步GIF文件的不同部分。 (此頁上的信息主要是來自W3C的GIF89a規範)。GIF文件是由一堆不同的“塊”數據構成。下圖顯示了所有不同類型的塊以及它們在文件中的位置。文件從左邊開始按照它的方式向右。在每一個分支,你可以通過一種或其他方式。比較大的中間部分在需要時可以重複出現多次。(從技術上講,它也可能被完全忽略,但我不能想象一個沒有圖像數據的GIF文件能有什麼好的。)

        我會通過一個GIF樣本文件告訴你這些塊的樣子。你可以看示例文件和其下面對應的字節。

        注意:並非所有的塊都被顯示在示例文件中。我提供的示例文件在適當的地方忽略了部分塊。這些不同的塊包括:header, logical screendescriptor(邏輯屏幕描述符), global color table(全局顏色表), graphics controlextension(圖形控制擴展), image descriptor(圖像描述符), local color table(本地顏色表), image data(圖像數據), plain text extension(純文本擴展), application extension(應用擴展), comment extension(註釋擴展), and trailer(預覽)。讓我們從第一個塊開始!

 

Header Block(報頭)

        樣本文件的:47 49 46 38 39 61

        所有GIF文件必須從報頭開始。報頭佔用文件的前六個字節。這些字節都應該符合ASCII字符編碼。實際上,這裏面有兩條信息。前三個字節被稱爲簽名。這幾個字符應該是“GIF”(即47=“G”,49=“I”,46=“F”)。接下來的三個字節指定我們對圖像進行編碼所使用的規範的版本。我們將只使用“89a”(即38=“8”,39=“9”,61=“A”)。另外一個公認版本號是“87a”,但我懷疑大多數人還會再遇到那些(The only other recognizedversion string is "87a" but i doubt most people will run into thoseanymore.)。

Logical Screen Descriptor

        示例文件的:0A 00 0A 00 91 00 00

        邏輯屏幕描述符總是緊跟報頭。該塊告訴解碼器一個圖像要佔用多少空間。這是整整7個字節長。從畫布的寬度開始。這個值是前兩個字節。它保存在一個所謂的規範簡單地調用無符號格式(It's saved in a formatcalled the spec simply calls unsigned)。基本上我們正在尋找一個16位的非負整數(0 – 65535)。與所有其他的GIF格式的多字節值,最低有效字節會被優先存儲(little-endian格式)。這意味着我們從字節流中讀取到0A 00的地方,我們通常會寫作00 0A等同於10。因此,我們的樣本圖像寬度爲10像素。更進一步例如255會存儲爲FF 00,但是256將會是00 01。正如你所期望的,畫布的高度也用這種方式。同樣,在示例文件中,高度值是0A 00即10像素。

        接着是一個壓縮字節(a packed byte)。這意味着,該字節在它的bit位上存儲了多個值。在這種情況下,字節91可表示爲二進制數10010001.(內置在windows的計算機實際上在轉換十六進制和二進制的數字時非常有用。務必確定你的windows版本里有“科學”和“程序員”模式。)第一個(最高有效)bit是全局顏色表標誌。0表示沒有,1表示顏色表會在後邊。在樣本文件中,我們可以看到有全局顏色表(將會是通常情況。)接下來的3bits代表顏色分辨率。規範描述這個值“是每一原始圖像用到的主要顏色的bit值減一”和“…代表圖像顏色的整個調色板的大小”。由於我並不討論這個做什麼,我會告訴你一個講解位和顏色深度更詳細的文章。現在1個已講完,注意001代表2bits/pixel,111表示82bits/pixel。下一個bit是排序標誌。值爲1,則全局顏色表中的顏色會按照重要性降序排列,通常意味着在圖像中“降低頻率”(If the values is 1, thenthe colors in the global color table are sorted in order of "decreasingimportance," which typically means "decreasing frequency" in theimage.)這對解碼器有益但不是必須的。示例中我們會使用0。最後3 bits是全局顏色表的大小。Well,that’s a lie;這並不是表的實際大小。如果這個值是N,則表的實際大小是2^(N+1)。樣本文件中,我們的這三個bit是1的二進制表示001。實際的表大小是2^(1+1)=4。(我們已經提到過幾次表示全局顏色表的字節,我們將在下一節中談論它是什麼。)

        下一字節是背景顏色索引。這個字節是唯一有意義的,如果全局顏色表標誌爲1。它表示全局顏色表中的顏色(通過指定其索引)應該作爲像素使用而不是在圖像數據中指定的值。存在一些情況,如果沒有全局顏色表,這個字節應該是0。

        邏輯屏幕描述符的最後一個字節是像素長寬比。我並不確定這個值是幹什麼的。我見過的大多數圖像的這個值是0。規範這樣描述該值,如果指定這個值爲N,N<>0,使用的實際比例將是(N+15)/64。 





未完。。。。。。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章