我正在尝试使用以下代码(从here复制)从openGL中的glReadPixels读取的像素数据中编写PNG文件(以png格式保存图像):
bool writePNGFileFromBuffer(const char *filename, unsigned char *pixels, int w, int h)
{
png_structp png = png_create_write_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL);//8
if (!png)
return false;
png_infop info = png_create_info_struct(png);//7
if (!info) {
png_destroy_write_struct(&png, &info);//
return false;
}
FILE *fp = fopen(filename, "wb");
if (!fp) {
png_destroy_write_struct(&png, &info);//
return false;
}
png_init_io(png, fp);//9
png_set_IHDR(png, info, w, h, 8 /* depth */, PNG_COLOR_TYPE_RGB, PNG_INTERLACE_NONE,
PNG_COMPRESSION_TYPE_BASE, PNG_FILTER_TYPE_BASE);//10
png_colorp palette = (png_colorp)png_malloc(png, PNG_MAX_PALETTE_LENGTH * sizeof(png_color));//4
if (!palette) {
fclose(fp);
png_destroy_write_struct(&png, &info);//
return false;
}
png_set_PLTE(png, info, palette, PNG_MAX_PALETTE_LENGTH);//12
png_write_info(png, info);//1
png_set_packing(png);//5
png_bytepp rows = (png_bytepp)png_malloc(png, h * sizeof(png_bytep));//
for (int i = 0; i < h; ++i)
rows[i] = (png_bytep)(pixels + (h - i) * w * 3);
png_write_image(png, rows);//2
png_write_end(png, info);//6
png_free(png, palette);//11
png_destroy_write_struct(&png, &info);//3
fclose(fp);
delete[] rows;
return true;
}
我在其他依赖项中链接了libpng和zlib库。但是当我编译代码时,它会出现以下错误:
错误77错误LNK2001:未解析的外部符号png_write_info
它在上面的代码段中标记的大约12个实例中给出了此错误。我很清楚,它无法找到函数的定义,但我不知道为什么?
任何帮助将不胜感激。感谢
编辑:我查看了头文件“png.h”,它包含所有函数的声明。函数在“pngwrite.c”中定义,我认为它应该从链接库中获取。
Edit2:在玩了几天之后,我发现当我将项目的输出类型(我使用libpng.lib)更改为Static Lib(.lib)时,一切正常,代码编译得很好但是使用.dll输出会抛出上面指定的错误。
我的问题是,我必须使用.dll输出,因为我在另一个巨大的项目中使用,我不能改变接受.lib。
对此有何帮助?
答案 0 :(得分:0)
你可能会失踪&#34; pnglibconf.h&#34;您必须从中复制 脚本/ pnglibconf.h.prebuilt到源目录中的pnglibconf.h。