Я использую pHash и эта библиотека использует libpng. У меня возникают проблемы с запуском моей программы, потому что libpng не загружает файл PNG.
- Версия libpng: 1.4.19
- Платформа: Windows 10
- Окружающая среда: Visual Studio 2015
Trivial
Просто, если вы столкнулись со следующими вопросами...
- Правильно ли путь к изображению? Да
- Является ли образ действительным PNG файлом? Да
Информация о кодах
Библиотека pHash использует CImg, версия CImg, которую они используют, немного устарела, я думаю:
#define cimg_version 148 // In CImg.h
Я отлаживал библиотеку, и проблемы возникают в CImg.h
(содержится в проекте pHash VС++):
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*)");
...
}
В этом фрагменте показана первая часть CImg<T>& _load_png(std::FILE *const file, const char *const filename)
, которая вызывается библиотекой CImg, используемой pHash.
Ошибка выполнения
Код компилируется отлично, но я получаю эту ошибку во время выполнения, которую я вижу в отладчике:
CImgIOException: не удалось инициализировать 'png_ptr'...
В пункте, указанном в коде. Я не знаю, почему, он не загружает изображение. Ошибка возникает при вызове png_create_read_struct
в CImg.h
. Этот код немного неясен, как определено в директивах препроцессора. Непонятно, почему он терпит неудачу.
Любые идеи?