0

giflib の使用方法の説明を読んで、次のコードを書きました。

GifFileType *gifFile = DGifOpenFileName("D:\\my.gif00.gif");
DGifSlurp(gifFile);
int h = gifFile->SHeight;
int w = gifFile->SWidth;
int count = gifFile->ImageCount;
GifPixelType *myPixels = new GifPixelType[w]; 

int errcode = DGifGetLine(gifFile, myPixels, 1);
if (errcode == GIF_OK) {
} else {
    PrintGifError();
}

ご覧のとおり、引数として DGifOpenFileName 関数に設定したファイルはすべてエラーになり、PrintGifError() は次のメッセージを出力します。

GIF-LIB エラー: #Pixels が Width * Height より大きくなっています。

私のコードで何が間違っているのか理解できません。私が欲しいのは、gifファイルのピクセルを読み取り、それらを編集してからgifファイルに戻すことです。この問題について助けていただけますか?

4

1 に答える 1

5

私の知る限り、これは gif ファイルが破損していることを示しているようです。

問題は、 を使用してはならないことDGifGetLine()です。この関数DGifSlurp()は、GIF ファイル全体を gifFile 構造体に読み込みます。内部的にはDGifGetLine()(および他のかなりの数のことを) 呼び出し、戻るまでにファイル全体が処理されています。その後に電話をかけようとしてもDGifGetLine()意味がありません。

これは dgif_lib.c が言っていることですDGifSlurp():

/******************************************************************************
 This routine reads an entire GIF into core, hanging all its state info off
 the GifFileType pointer.  Call DGifOpenFileName() or DGifOpenFileHandle()
 first to initialize I/O.  Its inverse is EGifSpew().
*******************************************************************************/
于 2013-05-09T17:12:39.737 に答える