2

GIF87a ラスター データ ストリームからデータ バイトをデコードしようとしています。LZW 可変長コードの読み取り方法 (および LSB... 最下位バイトが最初にこれに収まる方法) がわかりません。ラスター データ ストリームは次のように始まります (16 進数)。

06 6b 40 86 70 48 2c 1a 8f 44 4b 44 22 89 58 8e 10 c7 e1 80
  • 06 -> コードサイズ 6
  • 6b -> 107 のブロック バイト数
  • 40 -> クリア コー​​ド (2^6)、10 進数で 64、16 進数で 40
  • 86 -> 実際のデータの開始

GIF87a 仕様: http://www.w3.org/Graphics/GIF/spec-gif87.txt

ラスター ストリームには、グローバル マップ (または LZW ツリーの親) を指すインデックスが必要ですが、それを読み取る方法がわかりません。

例として、誰かが最初の数バイト (86 から始まる) を変換できますか?

4

1 に答える 1

0

この3MF Project GIFを読んでください。すべてのサブセクションには、ステッピングの例で必要なものがすべて含まれており、残りは仕様ファイルにあります。

今度は画像データ

ストリーム データは 1 バイトのブロック サイズで始まり、ビット ストリームになります。最後に、別のブロック サイズが続きます。フレーム全体を描画し、最後に読み取ったブロックの後にポインターを設定すると停止します。

ブロックサイズが見つかった場合0は、フレームデータの終わりを意味します。0x3bその後にターミネータがある場合は、ファイルの終わりに到達します。

ローカル カラー ビットは、開始時にストリーム内のコードごとにいくつのビットがあるかを示します。

実際に処理された BYTE の LSB を読み取り、それを右にシフトしてからコードを右にシフトし、このビットを MSB として追加します。必要なインデックスのビット数に達したら、LZW 解凍によって処理し、辞書に新しいコードを追加します。

辞書が 2^bits 境界を越える場合、コードのビットサイズを増やして続行します。クリアとエンドの特殊コードを処理することを忘れないでください...

だからあなたは持っています:06 6b 40 86 70 48 2c 1a

  • 06hは初期ビット サイズ - 1 なので、実際のビット サイズは7!!!
  • 6bhブロックサイズはバイトです
  • 40h明確なコードです (表に 64 色が存在しcolor[]、最初の空きインデックスが 66 であることを意味します)
  • 86 70 48 2c 1a [hex]= |1 0000110|01 110000|010 01000|0010 1100|00011 010| [bin]

コードは次のとおりです。

  • |0000110|110000 1|01000 01|1100 010|010 0010| [bin]
  • |0000110|1100001 |0100001 |11000010|0100010 | [bin]
  • 06,61,21,c2,22 [hex]

データの61h提案エラーは、これが本当に画像データの始まりですか (またはどこかで間違いを犯しました)? コードは、ディクショナリの最大インデックスよりも 1 つだけ大きくすることができます。ディクショナリは、最初のコードを除く各コードによって増加するため61h、ディクショナリの処理中42hはサイズのみです。リンクされたページの例を試してみてください...

于 2015-04-28T15:57:00.917 に答える