【发布时间】:2016-01-22 07:14:41
【问题描述】:
我正在尝试使用 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。
任何想法都将不胜感激。
编辑
我根据 cmets 中的建议添加了以下代码行:
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
【问题讨论】:
-
您能以某种方式检查 GIF 是否格式错误?
-
感谢您的意见。我已经用多个 gif 进行了测试,包括一些来自互联网 + 一些来自 giflib,所以我认为这不是这里的问题。
-
在同一个语句中有很多 .'s 和 ->'s 会混淆问题。您能否尝试检查 gif->SavedImages[0] 的有效性,然后仅在有效的情况下取消引用 RasterBits[0]?
-
您能否发布一个指向此代码失败的在线 GIF 的链接? (我认为您不能使用标准的“上传您的图像”,我认为它将所有内容都转换为 PNG!)
-
我在帖子中添加了一些 gif 链接。