3

我有一个 640x480x4 值的矩阵,即每个有 4 个通道 (RGBA) 的 640x480 像素。我想创建一个显示透明度的 png 文件。我曾尝试使用 opencv,但显然不支持透明度。我可以做到这一点的最快和最简单的方法是什么,我只需要保存一些图像?

4

2 回答 2

5

正如其他人所说,如果不使用外部库,您将无法轻松地在 C++ 中编写 PNG 图像文件。

libpng是最小和最便携的解决方案,它是官方的 PNG 参考库,大多数图像库都使用它来编写和读取 PNG 文件。这是一个相当容易使用的 C 库,但可能不是 C++ 新手的最佳解决方案。

使用以下内容编写 PNG 图像的示例libpng

FILE *fp = fopen("file.png", "wb");
png_structp png_ptr = png_create_write_struct(PNG_LIBPNG_VER_STRING, 0, 0, 0);
png_infop info_ptr = png_create_info_struct(png_ptr);
png_init_io(png_ptr, fp);

/* write header */
png_set_IHDR(png_ptr, info_ptr, width, height,
    bit_depth, color_type, PNG_INTERLACE_NONE,
    PNG_COMPRESSION_TYPE_BASE, PNG_FILTER_TYPE_BASE);

png_write_info(png_ptr, info_ptr);

/* write bytes */
png_bytep * row_pointers;
<allocate row_pointers and store each row of your image in it>
png_write_image(png_ptr, row_pointers);
png_write_end(png_ptr, NULL);

/* cleanup heap allocation */
for (y=0; y<height; y++) free(row_pointers[y]);
free(row_pointers);

fclose(fp);

libpng正如您所看到的,它需要相当多的行来简单地初始化编写上下文,并且我自愿删除了错误管理,这对于(用作实例)有点棘手,setjmp并且绝对不适合新手 C 程序员。

您可以查看更高级别的图像库,例如ImageMagick它有一个称为 C++ API 的库Magick++,这是将内存中的图像写入 PNG 文件的示例:

Magick::Blob blob(data, length); 
Magick::Image image; 
image.size("640x480") 
image.magick("RGBA"); 
image.read(blob);
image.write("file.png");

如您所见,使用更高级别的库要容易得多。

于 2013-04-25T11:43:59.777 回答
3

除了 BMP 图像,所有常见的图像格式都相当复杂,你真的不能只写几行代码就得到你想要的。它们都有许多元素(页眉、页脚等),并且通常在主图像部分进行压缩。

您需要使用某种库。我没有直接使用它,但是我在我的机器上编译的代码似乎经常使用libpng

于 2013-04-25T11:23:37.370 回答