1

私は実際に、次のコードで giflib を使用して gifFile から画像を抽出しようとしています。

t_gif   initGif(const char *filename){
    t_gif gif;
    int *error;
    GifFileType *GifFile = DGifOpenFileName(filename, error);
    assert(error != NULL);

    int ret = DGifSlurp(GifFile);
    assert(ret == GIF_OK);

    gif.h = (int)GifFile->SHeight;
    gif.w = GifFile->SWidth;
    gif.nbFrames = GifFile->ImageCount;
    gif.colorSize = GifFile->SColorResolution;

    GifImageDesc Image = GifFile->Image;
    SavedImage *img = &GifFile->SavedImages[0];

    cout << "width: " << gif.w << endl;
    cout << "height: " << gif.h << endl;
    cout << "Image Count: " << gif.nbFrames << endl;
    cout << "SColor Resolution: " << gif.colorSize << endl;
    Mat color = Mat(Size(gif.w, gif.h), CV_8UC1, img->RasterBits);
    imwrite("./test.png", color);
    return gif;
}

しかし、これはセグメンテーション違反を引き起こします。v2.4.5 で opencv を、v5.0.4 で giflib を使用しています。v4 の giflib では問題がなかったので、これは Opencv が原因ではないと思います。

さらに、次のテストでも segfault が発生します。

printf("%u\n", (unsigned int)img->RasterBits[0]);

gdb 出力:

(gdb) run bsd.gif 
Starting program: /home/matt/Code/perso/utils/gif/a.out bsd.gif
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1".
Gif Analyser tool
started by MG in may 2013
compiled with giflib: v5.0.4
width: 1000
height: 907
Image Count: 0
SColor Resolution: 8

Program received signal SIGSEGV, Segmentation fault.
0x0000000000401af3 in initGif (filename=0x7fffffffe2be "bsd.gif") at main.cpp:40
40      Mat color = Mat(Size(gif.w, gif.h), CV_8UC1, img->RasterBits);
(gdb) 

colorGlobal テーブルを使用して色を戻す方法もわかりません。

誰か助けてくれませんか?ありがとう

4

2 に答える 2

0

バージョン 4.1.6 に戻ったところですが、すべて問題ありません。v5 にはバグがある可能性があります。

于 2013-06-03T08:57:34.420 に答える