前回に引き続き画像データの圧縮について。
もう大切なことは述べたから後は細かいフォーマットについて。
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を書き、奇数列を書き込んである、というだけ。
単純な並び替えです。
以上、画像ブロックの説明を終わります。
次 画像のデコードの仕方について