使用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之后,我编译并执行了以下完整的独立测试程序:
#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()
签名,以及我将第二个输出行的值转换为显式(int)
的调整,这与您的代码相同。此外,代码被更改为显式打开Specialist_Science_Logo.gif
文件,这是您遇到问题的GIF图像文件之一。
此代码在Fedora x86-64、giflib 4.1.6、gcc 5.5.1上运行成功,没有任何问题。
用valgrind检测样例代码没有发现任何内存访问违规。
由此,我得出结论,所示代码没有任何问题。所显示的代码显然是从一个更大的应用程序中摘录的。该错误位于此应用程序的其他地方,或者可能是giflib本身,并且仅在此处显示。
相关文章:
- 访问者访问变体并返回不同类型时出错
- 在Linux for Windows上编译C++代码时出错
- 读取文件的最后一行并输入到链接列表时出错
- 重载操作程序时出错>>用于类中的字符串 memebr
- 调用专用模板时出错"no matching function for call to [...]"
- C++-试图将函数指针推回到另一个CPP文件中的矢量时出错
- LINK 尝试使用 OpenSSL evp aes 256 c++ 时出错
- 在Google Kick start中提交时出错
- 在c++中访问int到类对象的映射时出错
- 分段错误当我试图运行程序时出错
- 使用dynamic_cast和构造函数时出错
- CHECK(调用)函数在Google Colab中出错
- 用pybind11包装C++抽象类时出错
- 为x86而非x64编译时出错
- 从R调用C++函数并对其进行集成时出错
- 这个函数哪里出错了
- C++ 创建包含链表和字符串的对象的链接列表时出错
- 为重写std::exception的库生成swig接口时出错
- 导入/导出变量时出错
- 使用giflib解码gif时出错