GIF画像のLZW圧縮について質問があります。現在、https://nodamushi.hatenablog.com/entry/20090531/1243775161 こちらのサイトでGIF画像のLZW圧縮について学習しているのですが、ビット長の変更のタイミングがいまいち分かりません。 たとえば圧縮して ... → 510 → 511 → 300 → 400 → 512 → 513 → ... と数字の並びを取得し書き込もうとした時、少なくとも511まではビット長が9、512から先ではビット長が10になっていないといけないはずですが、その間にそれより若い数字が挟まっていたらビット長は次のどちら(あるいはそれ以外)になるのでしょうか。① ... → 510(9bit) → 511(9bit) → 300(9bit) → 400(9bit) ⇒ 512(10bit) → 513(10bit) → ...② ... → 510(9bit) → 511(9bit) ⇒ 300(10bit) → 400(10bit) → 512(10bit) → 513(10bit) → ... 要は、実際に出力数のビット長が変わったタイミングで変わるのか、次に出力数のビット長が伸びる可能性があるタイミングで替わるのか、という部分が分かりません。 デコードすることを考えた場合、①だと511の後で9bitの数値が来るのか10bitの数値が来るのか分からないので②が正しいような気がしていますが、確証が持てません。 説明が下手で申し訳ありませんが、どうか御教示いただけると幸いです。

1件の回答

回答を書く

1181907

2026-03-11 08:55

+ フォロー

正しいのは② です。

つまり:
新しい語(コード)を辞書に登録して辞書サイズが閾値(512, 1024, 2048)を超えた次の出力から、
ビット長を増やすのが正しい。

出力値 ビット長

510 9bit
511 9bit
300 10bit
400 10bit
512 10bit
513 10bit


GIFのLZW圧縮の基本

GIFは256色までの画像を扱う可逆圧縮形式。

圧縮方式はLZW(Lempel–Ziv–Welch)圧縮。

LZWは「繰り返されるパターンを辞書に登録して、辞書番号で置き換える」方式。

辞書初期化時には、色番号 + クリアコード + 終了コードを登録。

ビット長の可変について

GIFではファイル容量削減のためビット長が可変。

初期ビット長は、色数に応じた最小値からスタート(例:256色なら9bit)。

辞書登録数の増加に応じてビット長を増やす

(9bitの範囲)
コード出力: ... → 510 → 511
登録処理: 511登録により辞書サイズ=512
--ここで閾値到達--
(10bitの範囲)
コード出力: 300 → 400 → 512 → 513 ...

うったえる有益だ(0シェアするブックマークする

関連質問

Copyright © 2026 AQ188.com All Rights Reserved.

博識 著作権所有