0

GIF 画像ファイルの最初の 13 バイトは次のとおりです。

3 bytes - the ascii characters "GIF"
3 bytes - the version - either "87a" or "89a"
2 bytes - width in pixels
2 bytes - height in pixels
1 byte - packed fields
1 byte - background color index
1 byte - pixel aspect ratio

次のようなコードを使用して、最初の 6 バイトを自分で取得できます。

int G = getchar();
int I = getchar();
int F = getchar();

など .. 87a/89a 部分についても同じことを行うと、すべて最初の 6 バイトが取得され、GIF87a などの ASCII 文字が提供されます。

うーん、残りの情報を取得する方法がわかりません。同じ getchar(); を使用してみます。メソッドですが、それは私が期待するものではありません。幅と高さがそれぞれ 2 バイトであるため、350x350 の GIF ファイルがあるとします。しかし、この情報を基数 10 の実際の幅と高さを取得するにはどうすればよいでしょうか? 94 と 1 のビット論理積を試してみましたが、0 が返されることに気付きました。

幅と高さを取得する方法がわかれば、残りの情報に自分でアクセスできるようになると思います。

ピクセルの幅と高さはリトル インディアン形式で格納されます。

4

2 に答える 2

3

これは、範囲が限定された部分に分割された他の数字と同じです。たとえば、 を見てください43。各桁には、0 から 9 までの限られた範囲があります。したがって、次の桁は 10 の数であり、次に百の数 (10*10) などです。この場合、値の範囲は 0 から 255 までなので、次の数字は 256 の数字です。

256 * 1 + 94 = 350

標準では、バイト オーダーを指定する必要があります。つまり、最上位 (ビッグ エンディアン) が最下位 (リトル エンディアン) の前に来るどうかを指定する必要があります。

バイトオーダー: リトルエンディアン

于 2013-02-11T00:03:43.560 に答える
1

通常、圧縮されたビットストリームまたは画像データを読み取る場合、ファイルをバイナリ読み取りモードで開き、データを読み取り、getBits機能を通じて同じものを解釈できます。たとえば、以下のサンプルを検討してください

fptr = fopen("myfile.gif", "rb");

// Read a word
fread(&cache, sizeof(unsigned char), 4, fptr);

//Read your width through getBits
width = getBits(cache, position, number_of_bits);

ここを参照してくださいK & R 質問: getBits の詳細については、第 2 章の「getbits()」メソッドを理解するのに助けが必要です

于 2013-02-11T00:10:21.523 に答える