1

GIF 形式を解析しようとしていますが、画像データの読み取りに問題が 1 つあります。このデータはビット配列のように表現され、可変長の値を含みます。

元:

0010-1010-0010-0000-00111-10000-11111...

コードの長さが長くなることがありますが、これをどのように検出できるかわかりません。初期コードサイズ (最初のコードの長さ ex. 4) しかありません。

スタンダートは次のように述べています。

付録 F. 可変長コード LZW 圧縮。

...

アルゴリズムの可変長コードの側面は、圧縮コードに使用される初期ビット数を指定する初期コード サイズ (LZW 初期コード サイズ) に基づいています。入力ストリームで圧縮器によって検出されたパターンの数が、現在のビット数でエンコード可能なパターンの数を超えると、LZW コードあたりのビット数が 1 増加します。

...

4

2 に答える 2

2

GIF ファイルを解析する場合、イメージ記述子には、エンコードされていないシンボルのビット幅が含まれます (例: 8 ビット)。おそらく既にご存じのとおり、圧縮データの初期コード サイズは、エンコードされていないシンボルのビット幅よりも 1 ビット広いです (例: 9 ビット)。

また、おそらく既にご存じのとおり、GIF ファイルで可能な圧縮コードの値は、保存に 12 ビットを必要とする最大 0xFFF == 4095 まで徐々にサイズが大きくなります。

デコンプレッサが圧縮データからプルするコードごとに、デコンプレッサはその辞書に新しい項目を追加します。たとえば、デコンプレッサが読み取る最初の 2 つの 9 ビット コードが 0x028 0x0FF である場合、デコンプレッサは 2 バイト シーケンスを辞書に追加します。その後、デコンプレッサがコード 0x102 を読み取ると、デコンプレッサはその 0x102 コードを 2 つの 8 ビット バイト 0x28 0xFF にデコードします。

デコンプレッサがディクショナリに追加する次の項目には、コード 0x103 が割り当てられます。

デコンプレッサがディクショナリに追加する次の項目には、コード 0x104 が割り当てられます。...

最終的に、デコンプレッサは、コード 0x1FF が割り当てられた項目をディクショナリに追加します。これは、9 ビットに収まる最大の数です。その項目をディクショナリに格納した後、解凍プログラムは 10 ビット コードの読み取りを開始します。

デコンプレッサがディクショナリに追加する次の項目には、コード 0x200 が割り当てられます。

デコンプレッサにコード幅をインクリメントするよう指示するデータ シーケンス内の特別な「コマンド」はありません。デコンプレッサは、これまでにディクショナリに含まれるアイテムの数を追跡する必要があります (これは、次のアイテムをディクショナリに書き込む場所のインデックスとして便利に再利用できます)。デコンプレッサがアイテム 0x1ff をディクショナリに追加すると、デコンプレッサが 10 ビット コードの読み取りを開始します。デコンプレッサがアイテム 0x3ff をディクショナリに追加すると、デコンプレッサが 11 ビット コードの読み取りを開始します。

于 2011-05-30T05:37:31.877 に答える
1

最初にこの例を見てください。標準を見るよりも LZW を理解する方が明確かもしれません。そして、これも役に立つかもしれません。

于 2011-05-03T23:36:20.340 に答える