繁体   English   中英

使用giflib解码gif时出错

[英]Error when decoding a gif using giflib

我正在尝试使用giflib解码.gif文件。 以下代码在最后一行导致段错误(输出宽度/高度正确)。

GifFileType* gif = DGifOpenFileName(filename.c_str(), &errCode);
if (gif == NULL) {
    std::cout << "Failed to open .gif, return error with type " << errCode << std::endl;
    return false;
}

int slurpReturn = DGifSlurp(gif);
if (slurpReturn != GIF_OK) {
    std::cout << "Failed to read .gif file" << std::endl;
    return false;
}

std::cout << "Opened .gif with width/height = " << gif->SWidth << " " << gif->SHeight << std::endl;
std::cout <<  gif->SavedImages[0].RasterBits[0] << std::endl;

输出:

 Opened .gif with width/height = 921 922
 zsh: segmentation fault (core dumped)  ./bin/testgiflib

据我了解,giflib应该填充gif-> SavedImages。 但是在调用DGifSlurp()之后为NULL。

任何想法,将不胜感激。

编辑

我在注释中添加了以下几行代码:

if (gif->SavedImages == NULL) {
    std::cout <<"SavedImages is NULL" << std::endl;
}

将打印该行,指示SavedImages为NULL。

EDIT2

发生此问题的一些GIF(请注意,我无法在任何GIF上使用它):

https://upload.wikimedia.org/wikipedia/en/3/39/Specialist_Science_Logo.gif

 GIF image data, version 89a, 921 x 922

https://upload.wikimedia.org/wikipedia/commons/2/25/Nasa-logo.gif

 GIF image data, version 87a, 1008 x 863

前言:在我的giflib版本4.1.6中, DGifOpenFileName()函数仅采用filename参数,并且不返回错误代码,这是不相关的细节。

在针对API更改进行调整并添加必要的包含内容之后,我编译并执行了以下完整的独立测试程序:

#include <gif_lib.h>
#include <iostream>

int main()
{
    GifFileType* gif = DGifOpenFileName("Specialist_Science_Logo.gif");

    if (gif == NULL) {
        std::cout << "Failed to open .gif, return error with type " << std::endl;
        return false;
    }

    int slurpReturn = DGifSlurp(gif);
    if (slurpReturn != GIF_OK) {
        std::cout << "Failed to read .gif file" << std::endl;
        return false;
    }

    std::cout << "Opened .gif with width/height = " << gif->SWidth << " " << gif->SHeight << std::endl;
    std::cout <<  (int)gif->SavedImages[0].RasterBits[0] << std::endl;
}

除了头文件的存在,略微不同的DGifOpenFilename()签名以及我将第二条输出行的值DGifOpenFilename()转换为显式(int) ,这与您的代码相同。 另外,更改了代码以显式打开Specialist_Science_Logo.gif文件,这是您遇到问题的GIF图像文件之一。

此代码在Fedora x86-64,giflib 4.1.6,gcc 5.5.1上成功执行,没有任何问题。

使用valgrind检测示例代码不会发现任何内存访问冲突。

由此得出的结论是,所示代码没有任何问题。 所示代码显然是来自较大应用程序的摘录。 该错误位于此应用程序的其他位置,或者可能位于giflib本身,仅在此处显示。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM