CGIF:LZW圧縮法1

LZW圧縮法(LZW辞書)


左の3×3のGIF画像がどのように圧縮されているか見てみましょう。

GIFファイルはカラーテーブルを持っていて、そのテーブルのインデックスを使って色を格納しています。
インデックス ・・・・・・・・・
BLACKMAROON REDLIME WHITE

ピクセルは左から右、上から下の順で
0 -> f -> f -> f -> f -> f -> f -> f -> f
上のように配置されます。

abcd9caのようなデータ列がある時、
最後のデータを除いた部分(この場合abcd9c)をprefix、
最後のデータ(この場合a)をsuffixと呼ぶことにします。

上で作成した「0ffffffff」というようなデータを頭から順に見てゆき、長さが2以上の新しい順列が現れるたびに、新しいコード(0x102番から)を、その順列に割り当てていきます。
(1×1のGIFファイルの時は、長さ2以上の順列を取り出すことができませんが、このときはprefixのないsuffixだけの新しいコードを割り当てます。)

具体的には、まず0fが新しい順列なので、この順列にコード0x102を割り当てます。
prefixが0x0、suffixが0xfとなります。

次に、前回取り出した順列のsuffixから、新しい順列を調べていきます。
すると、ffが新しい順列として見つかりますので、この順列にコード0x103を割り当てます。
prefixが0xf、suffixが0xfとなります。

次はffという順列はすでに登場しているので、fffが新しい順列となります。
この順列にコード0x104を割り当て、prefixを0x103、suffixを0xfとします。
ここで、以前割り当てられたffというデータ列のコードをprefixに使用することで、圧縮が起こりました。

次は、fffの順列のコードもすでに割り当てられているので、ffffが新しい順列となります。
この順列にコード0x105を割り当て、prefixが0x104、suffixが0xfとなります。

最後は、ffの順列にコード0x106を割り当て、prefixを0xf、suffixを0xfとします。

この様子を表に示すと、以下のようになります。
コードに割り当てられた内容 コード prefixの中身suffixの中身
カラーテーブルのindex 0x0
0x1
0x2
0xff
クリアコード 0x100
終了コード 0x101
新しく作成されたコード 0x1020x00xf
0x1030xf0xf
0x1040x1030xf
0x1050x1040xf
0x1060xf0xf

0 -> f -> f -> f -> f -> f -> f -> f -> f だったものを
prefixを登録した順に並べ、最後に登録したsuffixをその後部に付け足したものが、
0 -> f -> 103 -> 104 -> f -> f のように圧縮できているのが分かります。
この圧縮は可逆圧縮です。

次は、prefix、suffixに登録されたコードをGIFファイルの中でどのように格納しているかについて説明したいと思います。

TOP LZW圧縮について LZW圧縮法2(イメージデータ) 戻る