読者です 読者をやめる 読者になる 読者になる

プログラムdeタマゴ

nodamushiの著作物は、文章、画像、プログラムにかかわらず全てUnlicenseです

GIFフォーマット講座2〜続.画像データの圧縮

前回に引き続き画像データの圧縮について。

もう大切なことは述べたから後は細かいフォーマットについて。

GIFの画像ブロックの構成はこうなっている↓(参照

<Image Descriptor>
Image Separator(=0x2C)[1byte]
Image Left Position[2byte]
Image Top Position[2byte]
Image Width[2byte]
Image Height[2byte]
Packed Fields[2byte]

Packed Fields = Local Color Table Flag 1 Bit
                      Interlace Flag                1 Bit
Sort Flag 1 Bit
Reserved 2 Bits
Size of Local Color Table 3 Bits

Image Separator:画像ブロックの始まりを表す先頭文字で0x2Cに固定。
Image Left Position、Image Top Position:このイメージブロックがGIF画像全体で左端、上端からどれだけ離れているかを表す。記述はリトルエンディアン
Image Width、Image Height :このイメージブロックの横幅と高さ。リトルエンディアン

Local Color Table Flag:ローカルカラーテーブルが存在するとき1。
Interlace Flag:インターレース画像の時1。インターレースについては後述する。
Sort Flag:ローカルカラーテーブルがソートされている場合1。
Reserved:仕様書のどこに記述あるのか分からん。無視しておk
Size of Local Color Table:0〜7の数で2^(x+1)がローカルカラーテーブルの色の個数になる。


< Local Color Table >
Local Color Table Flagが1の時2^(Size of Local Color Table+1)*3byte存在する。
順にRGBの値が1byteづつ入っている。

<Table Based Image Data>

LZW Minimum Code Size[1byte]
ブロックサイズ[1byte]
圧縮データ[ブロックサイズ分]
ブロックサイズ[1byte]
……(繰り返し)……
0x00[1byte]


実際に圧縮されたデータが入っている部分。
まず、一番最初に
LZW Minimum Code Size[1byte] (2~8)
が入っている。
これは最小読み込み長から1を引いた物で、これが例えば4なら、辞書を18(=2^4+2)個分初期化し、最初は5byteづつ読み込む。

次にImage Dataブロックが必要分並ぶ。
Image Dataは圧縮した結果をそのまま記載せずに、最大で255byteの小ブロックに分割し、それぞれのブロックの先頭にそのブロックの長さを書き加えて(1byte)記載する。
圧縮データが終わったら、0(1byte)が来る。



インターレースGIFについて



インターレースGIFは以下の4つに区分され保存されている。
Group 1 : Every 8th. row, starting with row 0. (Pass 1)
Group 2 : Every 8th. row, starting with row 4. (Pass 2)
Group 3 : Every 4th. row, starting with row 2. (Pass 3)
Group 4 : Every 2nd. row, starting with row 1. (Pass 4)

要するにまず、8の倍数の列(0含む)を全部書き、次に8の倍数+4の列を書き、4の倍数+2を書き、奇数列を書き込んである、というだけ。
単純な並び替えです。


以上、画像ブロックの説明を終わります。


次 画像のデコードの仕方について