Как сохранить XImage в виде строки base64 в формате PNG? - PullRequest
4 голосов
/ 05 июля 2011

Я занимаюсь разработкой в ​​Ubuntu Linux и C ++.

Я захватил изображение рабочего стола в XImage.

Как сохранить XImage как строку base64 в формате PNG?

Ответы [ 2 ]

1 голос
/ 05 июля 2011

Вот функция 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).

0 голосов
/ 05 июля 2011

Я собирался сказать, что для ответа нужно использовать libpng .Однако после быстрого просмотра документации я нахожу эту библиотеку гораздо более сложной, чем нужно (простые вещи должны быть простыми, сложные должны быть возможными ... после просмотра руководства кажется, что простые вещи с libpngвместо этого близко к невозможному).Формат PNG имеет опции gajillion, libpng чрезвычайно гибок и подключаем, но, очевидно, нет простого ярлыка, когда вы просто хотите сделать что-то более простое (например, сохранить одно непрозрачное изображение).просто сбросьте изображение в необработанном формате и затем используйте imagemagick (возможно, через канал).

С другой стороны, вы рассматривали возможность использования Qt вместо голого X?Захватывать экран легко, и вы можете получить его в гораздо более управляемом формате (QImage).Сохранение практически в любой формат файла, который вам нравится, также тривиально (однако формат png довольно труден для CPU с Qt, поэтому не рекомендуется, если вы хотите сделать захват живого видео).

...