Этот вопрос похож на этот
Самый быстрый способ захвата экрана
но для Linux / X11.
Чтобы быть более конкретным, мне нужен метод для захвата пиксельных изображений одного окна (программный эквивалент экрана alt-print в окнах), запущенного на диплайне X11.
Примечания и требования:
1) Даже если новое окно помещается поверх захваченного окна, пиксельное изображение все равно должно указывать на исходное окно приложения без каких-либо преград
2) не нужно, чтобы окно приложения было видно пользователю, мне просто нужно хранить пиксельные буферы / изображения для видео
другие альтернативы, которые я исследовал:
1) xvfb — работает, но выполняет рендеринг процессора, который медленный и
расточительный хороший GPU
2) x11 внутри многих lxc — теоретически может работать, но сложно
установка, и я не уверен, что она будет хорошо масштабироваться со многими окнами
захваченный
предложения и идеи приветствуются
Это возможно с помощью VirtualGL на сервере с аппаратным ускорением. В основном просто настройте сервер соответствующим образом, затем либо на том же компьютере, либо на компьютере в той же сети, запустите
export DISPLAY=<your xvfb display>
vglrun <your_app>
Это будет иметь следующие преимущества:
1) ваше приложение будет отображаться с использованием virtualGL, который будет использовать аппаратное обеспечение
2) VirtualGL отобразит ваш 3D-контекст на дисплее Xfvb, который будет отображать только 2D-виджеты в CPU
3) настроить Xvfb для рендеринга в кадровый буфер
4) прибыль!
Это невозможно с чистым X11.
Вы можете получить то, что вы хотите с помощью композитинга, но только на серверах, которые его поддерживают (большинство современных). Это на самом деле не имеет ничего общего с оконными менеджерами. WM — это просто еще один клиент, хотя и с некоторыми специальными способностями, но они не связаны с композитингом. Вы можете использовать тот же API композитинга.
man xcomposite
должен начать вас.
Ты можешь использовать XWD (1) сбросить окно X11 (и xwud (1) чтобы отобразить это). ImageMagick и Инструменты Netpbm знать, как обращаться с форматом XWD. Но это не особенно быстро. И они не будут раскрывать скрытые части окна.
Я бы взял источники gnome-screenshot
или какой-либо другой существующий инструмент с открытым исходным кодом, и выясните, как они это делают.
Вы можете найти источники, которые использует Ubuntu здесь: http://packages.ubuntu.com/quantal/gnome-screenshot
Но не забудьте проверить лицензию, прежде чем вырезать и вставлять большие фрагменты кода!
Я видел комментарии о том, что это не может быть сделано в X11, поэтому может быть что-то, чего я не понимаю, но я могу сделать снимок экрана, используя следующий код.
#include <X11/Xlib.h> //-lX11
#include <X11/Xutil.h>
#include <X11/Xmd.h>
#include <X11/Xatom.h>
#include <jpeglib.h> //-ljpeg
void CopyDesktopImage(std::string sFilePath_Name)
{
Display *dis=XOpenDisplay((char *)0);
Screen *scr = XDefaultScreenOfDisplay(dis);
Drawable drawable = XDefaultRootWindow(dis);
XImage *image = XGetImage(dis, drawable, 0, 0, scr->width, scr->height, AllPlanes, ZPixmap);
Save_XImage_to_JPG(image, sFilePath_Name.c_str(), 75);
XDestroyImage(image);
XCloseDisplay(dis);
}
void Save_XImage_to_JPG(XImage *image, std::string FileName, int Quality)
{
FILE* outfile = fopen(FileName.c_str(), "wb");
if(outfile == NULL) return;
jpeg_compress_struct cinfo;
jpeg_error_mgr jerr;
cinfo.err = jpeg_std_error(&jerr);
jpeg_create_compress(&cinfo);
jpeg_stdio_dest(&cinfo, outfile);
cinfo.image_width = image->width;
cinfo.image_height = image->height;
cinfo.input_components = image->bitmap_unit >> 3;
cinfo.in_color_space = JCS_EXT_BGRX;
jpeg_set_defaults(&cinfo);
/*set the quality [0..100] */
jpeg_set_quality(&cinfo, Quality, true);
jpeg_start_compress(&cinfo, true);
JSAMPROW row_pointer; /* pointer to a single row */
while (cinfo.next_scanline < cinfo.image_height)
{
row_pointer = (JSAMPROW) &image->data[cinfo.next_scanline*image->bytes_per_line];
jpeg_write_scanlines(&cinfo, &row_pointer, 1);
}
jpeg_finish_compress(&cinfo);
fclose(outfile);
}
Это просто дикое предположение, но я предполагаю, что вы можете использовать x11vnc с опцией -id [windowid] (http://www.karlrunge.com/x11vnc/x11vnc_opts.html#opt-id) для потоковой передачи этого единственного окна через VNC ,
Это покажет вам все окно с тем же позиционированием, что и на главном экране (вы можете потерять некоторые всплывающие меню), даже если оно закрыто. Вы можете получить координаты окна с истинного экрана X11.
Xpaint — это очень старая утилита X11, созданная с использованием набора виджетов MIT Athena. Файл> Сделать снимок захватит окно или выделенный мышью прямоугольник с экрана.
ИЛИ ЖЕ
MagiCapture — это утилита для захвата и просмотра экрана для системы X Window. Пользователь может захватить одно окно, одно окно с украшениями, прямоугольную область дисплея или весь сам дисплей. Пользователь может сохранить захваченное изображение в графический файл, поддерживаемый инструментарием ImageMagick, который поддерживает большинство (если не все) популярные графические форматы. MagiCapture использует библиотеки GLIB и GTK + для пользовательского интерфейса и библиотеки ImageMagick и GdkMagick для всей графической обработки. Требуется ImageMagick.
ИЛИ ЖЕ
ZScreen: — Это приложение для захвата экрана только для Windows имеет множество функций. Он захватывает снимок активного окна, выбранного окна или всего экрана. Получив изображение, автоматически откройте его в редакторе изображений или загрузите в Twitpic, YFrog, Flickr или в одну из нескольких поддерживаемых служб. ZScreen кэширует все ваши изображения, даже те, что находятся в буфере обмена, поэтому всегда есть история ваших снимков экрана прямо у вас под рукой.
С помощью хитрого хака в локальной сети вы можете использовать возможность удаленного доступа X, открыть свой порт прослушивания X, а затем использовать env var, чтобы установить экспорт в порт прослушивания X, а затем использовать XscreenCapture.