【发布时间】:2016-11-08 18:58:17
【问题描述】:
我正在使用pHash,而该库使用libpng。我在运行程序时遇到问题,因为 libpng 无法加载 PNG 文件。
- libpng 版本:1.4.19
- 平台:Windows 10
- 环境:Visual Studio 2015
琐碎
只要你提出以下问题......
- 图像的路径是否正确?是的
- 图像是有效的 PNG 文件吗?是的
代码详情
图书馆pHash使用CImg,我认为他们使用的CImg版本有点旧:
#define cimg_version 148 // In CImg.h
我已经调试了库,问题出现在CImg.h(包含在pHash VC++项目中):
CImg<T>& _load_png(std::FILE *const file, const char *const filename) {
if (!file && !filename)
throw CImgArgumentException(_cimg_instance
"load_png() : Specified filename is (null).",
cimg_instance);
// Open file and check for PNG validity
if (Buffer) strcat(Buffer, "Checking PNG availability\r\n");
const char *volatile nfilename = filename; // two 'volatile' here to remove a g++ warning due to 'setjmp'.
std::FILE *volatile nfile = file?file:cimg::fopen(nfilename,"rb");
unsigned char pngCheck[8] = { 0 };
cimg::fread(pngCheck,8,(std::FILE*)nfile);
if (png_sig_cmp(pngCheck,0,8)) {
if (!file) cimg::fclose(nfile);
throw CImgIOException(_cimg_instance
"load_png() : Invalid PNG file '%s'.",
cimg_instance,
nfilename?nfilename:"(FILE*)");
}
// Setup PNG structures for read
png_voidp user_error_ptr = 0;
png_error_ptr user_error_fn = 0, user_warning_fn = 0;
png_structp png_ptr = png_create_read_struct(PNG_LIBPNG_VER_STRING,user_error_ptr,user_error_fn,user_warning_fn);
if (!png_ptr) { // <-- PROBLEM HERE
if (!file) cimg::fclose(nfile);
throw CImgIOException(_cimg_instance
"load_png() : Failed to initialize 'png_ptr' structure for file '%s'.",
cimg_instance,
nfilename?nfilename:"(FILE*)");
...
}
sn-p 显示CImg<T>& _load_png(std::FILE *const file, const char *const filename) 的第一部分,由pHash 使用的CImg 库调用。
运行时问题
代码编译得很好,但我在运行时得到了这个错误,我可以在调试器中看到:
CImgIOException: 无法初始化 'png_ptr'...
在代码中指出的点。我不知道为什么,它无法加载图像。在CImg.h 中调用png_create_read_struct 时发生故障。正如通过预处理器指令定义的那样,该代码有点晦涩难懂。目前尚不清楚为什么会失败。
有什么想法吗?
【问题讨论】:
-
也许它希望在传递给 png_create_read_struct() 的值中使用 NULL 而不是 0。
-
我可以试试,但是
#define NULL 0不行吗? -
另外,我更改了
user_error_fn和user_warning_fn以指向我创建的一些函数,用于查看我遇到的错误并仍然遇到同样的问题 -
在某些平台上 NULL 为 0,在其他平台上 0L 或 (void*)0 应该都是等效的。为了清楚起见,最好使用 NULL 而不是其中之一,即使问题可能是其他问题。
-
另外,请确保您在构建 libpng 和您的应用程序时使用了相同的设置(32 位与 64 位、发布与调试等)。
标签: c++ visual-c++ libpng cimg