如何将PNG格式的XImage保存为base64string?

我正在开发Ubuntu Linux和C ++。

我将桌面图像捕获到XImage。

如何将PNG格式的XImage保存为base64string?

这里有一个C函数来将XImage数据转换成JPEG图像:

 void write_jpeg( FILE *outfile, int width, int height, unsigned char *rgb, int quality) { struct jpeg_compress_struct cinfo; struct jpeg_error_mgr jerr; JSAMPROW scanline[1]; cinfo.err = jpeg_std_error(&jerr); jpeg_create_compress(&cinfo); jpeg_stdio_dest(&cinfo, outfile); cinfo.image_width = width; cinfo.image_height = height; cinfo.input_components = 3; cinfo.in_color_space = JCS_RGB; jpeg_set_defaults(&cinfo); jpeg_set_quality(&cinfo, quality, TRUE); jpeg_start_compress(&cinfo, TRUE); while (cinfo.next_scanline < (unsigned int) height) { scanline[0] = rgb + 3 * width * cinfo.next_scanline; jpeg_write_scanlines(&cinfo, scanline, 1); } jpeg_finish_compress(&cinfo); jpeg_destroy_compress(&cinfo); } 

我相信你可以很容易地把它放到你的代码中。 你只需要使用适当的库来保存一个PNG文件(而不是一个JPEG文件)。

我正要说,答案应该是使用libpng 。 然而,在快速浏览一下文档之后,我发现这个库的方法比需要的复杂得多(容易的事情应该很简单,应该是可能的事情……看看手册后,似乎用libpng简单的事情几乎是不可能的) 。 PNG格式有一个gajillion选项,libpng是非常灵活和可插拔的,但显然没有简单的捷径,当你只是想做一些简单的事情(如保存一个不透明的图像)。

我想我会试图以原始格式转储图像,然后使用imagemagick(可能通过管道)。

另一方面,你认为使用Qt而不是裸X? 捕获屏幕很容易,你可以得到一个更易于管理的格式(QImage)。 保存到几乎所有你喜欢的文件格式也是微不足道的(png格式是有点难,CPU与Qt,所以不建议如果你想做一个实时视频捕捉)。