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

Writing PNG file from pixel data using libpng

本文关键字:PNG 文件 数据 像素数 libpng 像素 使用      更新时间:2023-10-16

我正试图从glReadPixels在openGL中读取的像素数据中编写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)静态库(. Lib),一切工作和代码编译得很好,但与。dll输出抛出上述指定的错误。

我的问题是,我必须使用。dll输出,因为我在另一个巨大的项目中使用,我不能更改为接受。lib。

有什么帮助吗?

您可能缺少必须从中复制的"pnglibconf.h"脚本/pnglibconf.h。在源目录中预构建到pnglibconf.h