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

Я разрабатываю в Ubuntu Linux и C++.

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

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


person Hwansoo Kim    schedule 05.07.2011    source источник


Ответы (2)


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

person BЈовић    schedule 05.07.2011

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

Я думаю, у меня возникнет соблазн просто сбросить изображение в необработанном формате, а затем использовать imagemagick (возможно, через канал).

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

person 6502    schedule 05.07.2011
comment
libpng может быть пугающим, но написать помощника/оболочку для создания простых изображений не составит труда: например, zarb.org/~gc/html/libpng.html - person leonbloy; 05.07.2011
comment
@leonbloy: 34 непустые строки без комментариев просто для загрузки изображения не пугают. Это глупо. В Qt это QImage img(filename);. - person 6502; 05.07.2011