使用libpng从像素数据写入PNG文件

时间:2014-03-22 05:47:43

标签: c++ opengl libpng

我正在尝试使用以下代码(从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。

对此有何帮助?

1 个答案:

答案 0 :(得分:0)

你可能会失踪&#34; pnglibconf.h&#34;您必须从中复制 脚本/ pnglibconf.h.prebuilt到源目录中的pnglibconf.h。