如何从GIFLIB SavedImage结构获取RGB颜色数据

时间:2019-06-18 14:40:16

标签: c++ compression giflib

我正在使用GIFLIB加载gif文件,我想从每个帧中提取RGB数据。

我已经使用DGifSlurp加载了文件,但是我无法精确地确定如何从SavedImage结构中获取RGB数据。尽管我已经猜到了如何进行两个测试,但是似乎第三个测试由于内存异常而崩溃。库中应该使用一个函数,还是简单的代码?

void    TestGIF()
{
    int error=0;
    GifFileType * gif=DGifOpenFileName("d:/exampleGIF3.gif",&error);

    error=DGifSlurp(gif);

    unsigned int  h=gif->SHeight;
    unsigned int w=gif->SWidth;

    int i,j;
    unsigned char * d=malloc(w*h*4);
    unsigned char * save=d;

    for(i=0;i<gif->ImageCount;i++)
    {
        d=save;
        SavedImage * p=&gif->SavedImages[i];

        for(j=0;j<w*h;j++)
        {
            int c=p->RasterBits[j];
            if(c==gif->SBackGroundColor)
            {
                d+=4;           //use last frame colour
            }
            else
            {
                GifColorType rgb=gif->SColorMap->Colors[c];
                *d++=rgb.Blue;
                *d++=rgb.Green;
                *d++=rgb.Red;
                *d++=0xff;
            }
        }
        char outname[512];
        sprintf(outname,"d:/image%02d.tga",i);

        SAVETGA(outname,save,w,h,4);
    }
    free(save);
    error=DGifCloseFile(gif, &error);       
}

在此示例gif中读取13的第三帧时,它因内存异常而崩溃

请问我应该使用什么代码从SavedImage结构中获取RGB数据?

谢谢

肖恩

1 个答案:

答案 0 :(得分:0)

啊。 SavedImage结构具有左上角的宽度和高度值,因此我读取了太多数据,因此出现了内存异常。否则,代码似乎可以正常工作,至少可以使用我拥有的gif。