Я разрабатываю в Ubuntu Linux и C++.
Я захватил изображение рабочего стола в XImage.
Как сохранить XImage как строку base64 в формате PNG?
Я разрабатываю в Ubuntu Linux и C++.
Я захватил изображение рабочего стола в XImage.
Как сохранить XImage как строку base64 в формате PNG?
Вот функция 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, однако, несколько тяжел для процессора с Qt, поэтому не рекомендуется, если вы хотите сделать захват видео в реальном времени).
QImage img(filename);
.
- person 6502; 05.07.2011