用C++创建一个RGBA图像

Aly*_*Aly 3 c++ image rgba

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

zak*_*ter 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);
Run Code Online (Sandbox Code Playgroud)

正如你所看到的,它需要相当长的一段线简单地初始化写作方面,我主动删除错误管理这是一个有点棘手与libpng(使用setjmp为实例)和definitly不适合初学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");
Run Code Online (Sandbox Code Playgroud)

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