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

4

我正在使用Ubuntu Linux和C++进行开发。

我已经捕获了桌面图像到XImage中。

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

2个回答

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


0

我本来想说答案应该使用libpng。然而,在快速查看文档后,我发现这个库比需要的要复杂得多(简单的事情应该很容易,难的事情应该是可能的...在查看手册后,似乎使用libpng进行简单的事情相当困难)。PNG格式有无数的选项,libpng非常灵活和可插拔,但显然没有简单的捷径,当你只想做一些更简单的事情时(比如保存一个不透明的图像)。

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

另一方面,您是否考虑过使用Qt而不是裸露的X?捕获屏幕很容易,并且您可以以更可管理的格式(QImage)获取它。保存到几乎任何文件格式也很容易(但是在Qt中,png格式对CPU有点困难,因此不建议进行实时视频捕获)。


libpng可能会让人感到吓人,但编写一些辅助/包装程序来创建简单的图像不应该很难:例如http://zarb.org/~gc/html/libpng.html - leonbloy
1
@leonbloy:为了加载一张图片而写34行非空非注释代码并不令人畏惧,只是愚蠢。在Qt中,这可以用QImage img(filename);实现。 - 6502

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接