使用 giflib 解码 gif 时出错
Error when decoding a gif using giflib
我正在尝试使用 giflib 解码 .gif 文件。以下代码导致最后一行出现段错误(输出 width/height 是正确的)。
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()
函数只接受文件名参数,并没有return错误代码,这是无关紧要的细节。
针对 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()
签名,以及我将第二个输出行的值转换为显式 (int)
的调整外,这与您的代码相同。此外,代码已更改为显式打开 Specialist_Science_Logo.gif
文件,这是您遇到问题的 GIF 图像文件之一。
此代码在 Fedora x86-64、giflib 4.1.6、gcc 5.5.1 上成功执行,没有任何问题。
使用 valgrind 检测示例代码没有发现任何内存访问冲突。
据此,我断定显示的代码没有任何问题。显示的代码显然是从一个更大的应用程序中摘录的。该错误存在于此应用程序的其他地方,或者可能存在于 giflib 本身,并且只出现在这里。
我正在尝试使用 giflib 解码 .gif 文件。以下代码导致最后一行出现段错误(输出 width/height 是正确的)。
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()
函数只接受文件名参数,并没有return错误代码,这是无关紧要的细节。
针对 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()
签名,以及我将第二个输出行的值转换为显式 (int)
的调整外,这与您的代码相同。此外,代码已更改为显式打开 Specialist_Science_Logo.gif
文件,这是您遇到问题的 GIF 图像文件之一。
此代码在 Fedora x86-64、giflib 4.1.6、gcc 5.5.1 上成功执行,没有任何问题。
使用 valgrind 检测示例代码没有发现任何内存访问冲突。
据此,我断定显示的代码没有任何问题。显示的代码显然是从一个更大的应用程序中摘录的。该错误存在于此应用程序的其他地方,或者可能存在于 giflib 本身,并且只出现在这里。