9

私は PHP で GIF を解凍しようとしてきましたが、LZW 解凍以外はすべてダウンしているようです。表示されている画像を保存しました:サンプル画像

この画像は次のように 3 x 5 です。

Blue  Black Black
Black Blue  Black
Black Black Black
White White White
White White White

Binary で手動で処理し、このファイルを解析することにしました。手動解析の結果は以下のとおりです。ここでラスターデータをデコードする方法については、まだ行き詰まっています。ラスター データがどのように画像になるかを説明できますか? 1 つの画像を分解できましたが、他には何もありません (この画像ではありません)。これがどのように崩壊するかについての私の理解を投稿しましたが、明らかに間違っています。

01000111 G
01001001 I
01000110 F
00111000 8
00111001 9
01100001 a

Screen Descriptor
WIDTH
00000011 3
00000000

00000101 5
00000000

10010001 GCM (1), CR (001), BPP (001), CD = 2, COLORS = 4

00000000 BGCOLOR Index

00000000 Aspect Ratio

GCM
BLUE
00110101 | 53
00000000 | 0
11000001 | 193

WHITE
11111111 | 255
11111111 | 255
11111111 | 255

BLACK
00000000 | 0
00000000 | 0
00000000 | 0

00000000 | 0
00000000 | 0
00000000 | 0

Extension
00100001 | 21
Function Code
11111001 | F9
Length
00000100 | 4
00000000
00000000
00000000
00000000
Terminator
00000000

Local Descriptor
00101100 Header
XPOS
00000000 | 0
00000000

YPOS
00000000 | 0
00000000

Width
00000011 | 3
00000000

Height
00000101 | 5
00000000

Flags
00000000 (LCM = 0, Interlaced = 0, Sorted = 0, Reserved = 0, Pixel Bits = 0)

RASTER DATA
Initial Code Size
00000010 | 2
Length
00000101 | 5

Data
10000100
01101110
00100111
11000001
01011101

Terminator
00000000

00111011 | ;
00000000

私の試み

10000100
01101110
00100111
11000001
01011101

初期コード サイズ = 3 一度に 2 ビットを読み取る

10
00
Append last bit to first (010)
String becomes 010 or 2. 2 would be color # 3 or BLACK

この時点で、私はすでに間違っています。最初の色は青にする必要があります。

私が使用しているリソース:

http://www.daubnet.com/en/file-format-gif http://en.wikipedia.org/wiki/Graphics_Interchange_Format http://www.w3.org/Graphics/GIF/spec-gif87.txt

4

5 に答える 5

15

GIF パーサー

あなたは、GIF パーサーがどのように機能するかを理解するために、独自の GIF パーサーを書きたいと言いました。事実上の参照実装である GIFLIBなど、GIF リーダーを含むライブラリのソース コードを確認することをお勧めします。関連するソース ファイルは次のとおりですdgif_lib.c。で開始してデコードするか、 slurpLZW 解凍の実装にジャンプします。

画像のデコード方法は次のとおりです。

問題は、入力バイトを LZW コードに誤って分割していたことだと思います。

色数は です(0b001 + 1) * 2 = 4

コード サイズは 2 + 1 = 3 ビットから始まります。

したがって、最初の辞書は

000 = color 0 = [blue]
001 = color 1 = [white]
010 = color 2 = [black]
011 = color 3 = [black]
100 = clear dictionary
101 = end of data

現在、GIF は LZW コードを LSB ファーストでバイトにパックします。したがって、最初のコードは、最初のバイトの最下位 3 ビットとして格納されます。次の 3 ビットとして 2 番目のコード。等々。あなたの例 (最初のバイト: 0x84= 10000100) では、最初の 2 つのコードは100(クリア) と000(青) です。全部

01011101 11000001 00100111 01101110 10000100

のようにコードに分割されます (最上位の 3 ビット コードを読み取った後、4 ビット グループに切り替えます111) 。

0101 1101 1100 0001 0010 0111 0110 111 010 000 100

これは次のようにデコードされます。

     last
code code
 100      clear dictionary
 000      output [blue] (1st pixel)
 010  000 new code in table:
              output 010 = [black]
              add 110 = old + 1st byte of new = [blue black] to table
 111  010 new code not in table:
              output last string followed by copy of first byte, [black black]
              add 111 = [black black] to table
              111 is largest possible 3-bit code, so switch to 4 bits
0110 0111 new code in table:
              output 0110 = [blue black]
              add 1000 = old + 1st byte of new = [black black blue] to table
0111 0110 new code in table:
              output 0111 = [black black]
              add 1001 = old + 1st byte of new = [blue black black] to table
...

したがって、出力が開始されます (3 列にラップ):

blue  black black
black blue  black
black black ...

それはあなたが望んでいたものです。

于 2013-01-10T00:42:31.910 に答える
1

独自の GIF リーダーを作成しないソリューション

自分の教化以外の用途については、これを試してください。

いくつかのメモ

  • GIF ファイルは GIF89a です。GIF87a 仕様にリンクしました。89a仕様はこちら。
  • ライブラリを使用して画像を解析するとパフォーマンスが低下するのではないかと心配しているようです。これは意味がありません。ライブラリは通常、最適化された C で実装されます。手巻きのソリューションは、インタープリター言語である PHP で記述されます。
  • imagemagickのようなライブラリがサポートするPCXについて言及しました。

または、PNGを使用してください

ZPL 2 プログラミング マニュアルによると、PNG がサポートされています。たとえば、~DY(Download Graphics) コマンドは、デフォルトの GRF に加えて、(PNG) がオプションであるb(format) パラメーターを取ります。PNG 画像をゼブラ ネットワーク プリンタに印刷するPも参照してください。

GIF を PNG に変換するためのライブラリはたくさんあります。ImageMagick (PHP バインディング)を使用するか、PHP 関数imagecreatefromgifimagepng.

于 2013-01-09T22:53:35.390 に答える
0

LZW のデコードについてはお手伝いできませんがimagecreatefromgif()、PHP GD 拡張などのライブラリ関数を使用して GIF ファイルを解析し、画像データを抽出してから、目的の形式に変換する方が簡単ではないでしょうか。 ?

于 2013-01-07T20:57:16.533 に答える