如何将图像保存为PNG格式的base64字符串?

时间:2011-07-05 06:18:27

标签: c++ linux image png base64

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

我将桌面图像捕获到了XImage。

如何将XImage保存为PNG格式的base64字符串?

2 个答案:

答案 0 :(得分:1)

这是一个将XImage数据转换为jpeg图像的C函数:

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文件)。

答案 1 :(得分:0)

我正要说答案应该是使用libpng。然而在quick look at the documentation之后我发现这个库比想要的要复杂得多(容易的事情应该很简单,应该可以做的很难......看完手册之后看起来用libpng这么简单的东西是不可能的) 。 PNG格式有很多选项,libpng非常灵活且可插拔,但显然没有简单的快捷方式,只是想做一些更简单的事情(比如保存一个不透明的图像)。

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

另一方面,您是否考虑使用Qt而不是裸X?捕获屏幕很简单,您可以使用更易于管理的格式(QImage)。保存到你喜欢的几乎任何文件格式也是微不足道的(png格式在Qt的CPU上有点难,所以如果你想进行实时视频捕获,不推荐使用。)