用C ++创建一个RGBA图像

时间:2013-04-25 11:10:39

标签: c++ image rgba

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

2 个答案:

答案 0 :(得分:5)

正如其他人所说,如果不使用外部库,就无法用C ++编写PNG图像文件。

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

使用libpng编写PNG图像的例子:

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,其中包含名为Magick++的C ++ API,以下是将内存中的图像写入PNG文件的示例:

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

正如您所看到的,使用更高级别的库会更容易。

答案 1 :(得分:3)

除了BMP图像之外,所有常见的图像格式都相当复杂,您实际上不能只编写几行代码并获得所需内容。它们都有许多元素(页眉,页脚等),通常在主图像部分压缩。

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