Самый быстрый способ захвата экрана в Linux

Этот вопрос похож на этот

Самый быстрый способ захвата экрана

но для Linux / X11.

Чтобы быть более точным, мне нужен метод для захвата пиксельных изображений одного окна (программный эквивалент экрана alt-print в окнах), запущенного на диплее X11.

Примечания и требования:

1) Даже если новое окно помещается поверх захваченного окна, пиксельное изображение все равно должно указывать на исходное окно приложения без каких-либо преград

2) не нужно, чтобы окно приложения было видно пользователю, мне просто нужно хранить пиксельные буферы / изображения для видео

другие альтернативы, которые яМы исследовали:

1) xvfb - работает, но выполняет рендеринг процессора, что является медленным и расточительным для хорошего графического процессора

2) x11 внутри многих lxc - теоретически может работать, но сложно настроить, и яя не уверен, что он будет хорошо масштабироваться при захвате многих окон

предложения и идеи приветствуются

 Robert Mason20 нояб. 2012 г., 21:14
Да, рендеринг процессора медленный и расточительный, но эта производительность недопустимо медленная? Кроме того, в зависимости от используемого вами оконного менеджера, если это оконный менеджер композитинга, вы можете искать специфичный для wm API, который может дать вам указатель на внеэкранный буфер приложений. Все, что вам нужно сделать, это сделать копию буфера до того, как приложение перерисовает себя.
 BЈовић20 нояб. 2012 г., 20:22
если окно закрыто, то, что вы читаете, не определено.
 technosaurus29 нояб. 2012 г., 05:07
Вы можете использовать wmctrl или xdotool для активации окна, если это приемлемо, также xwininfo полезен для получения идентификатора окна для xwd (если вы используете xwd, выведите его в> name.xwd и некоторые графические программы смогут открыть его изначально)
 lurscher20 нояб. 2012 г., 22:18
@RobertMason, производительность (запуска приложений внутри xvfb) не является неприемлемо медленной, просто достаточно медленной, поэтому стоит тратить время на поиск альтернатив
 NoBugs29 нояб. 2012 г., 15:59
Интересно, будет ли решение X11 лучшим, поскольку в будущих версиях Linux оно может отсутствовать ?:h-online.com/open/news/item/Ubuntu-to-abandon-X11-1131920.html
 lurscher20 нояб. 2012 г., 22:13
@RobertMason, это сработало бы, и это определенно было бы правильным ответом, если бы кто-то мог предложить оконный менеджер, который 1) поддерживает рендеринг ускорения GPU (я знаю, что такое архитектура x11, но я полагаю, что это делается с помощью расширений) и 2) поддерживает этот конкретный вид API

Ответы на вопрос(8)

XWD (1) сбросить окно X11 (иxwud (1) чтобы отобразить это).ImageMagick иИнструменты Netpbm знать, как обращаться с форматом XWD. Но это не особенно быстро. И они не будут раскрывать скрытые части окна.

ость удаленного доступа X, открыть свой порт прослушивания X, а затем использовать env var, чтобы установить экспорт в порт прослушивания X, а затем использовать XscreenCapture.

Вы можете получить то, что вы хотите с помощью композитинга, но только на серверах, которые его поддерживают (большинство современных). Это на самом деле не имеет ничего общего с оконными менеджерами. WM - это просто еще один клиент, хотя и с некоторыми особыми способностями, но они не связаны с композитингом. Вы можете использовать тот же API композитинга.

man xcomposite должен начать тебя.

 n.m.22 нояб. 2012 г., 20:52
Ну, кажется, они говорят более или менее то же самое, что и япоговорю, только поподробнее. Фрагмент кода использует функции из.xcomposite
 lurscher22 нояб. 2012 г., 20:34
мы спросили об этом в списке рассылки compiz, но они нея думаю, что есть много смысла делать это из композитного менеджера:lists.compiz.org/pipermail/dev/2012-November/thread.html#1545 i 'я рассмотрю xcompòсайт и посмотреть, к чему это приведет

говорящие, что это можетв 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);
}
</jpeglib.h></x11></x11></x11></x11>

созданная с использованием набора виджетов MIT Athena. Файл> Take Snapshot захватит окно или выделенный мышью прямоугольник с экрана.

ИЛИ ЖЕ

MagiCapture - это утилита для захвата и просмотра экрана для системы X Window. Пользователь может захватить одно окно, одно окно с украшениями, прямоугольную область дисплея или весь сам дисплей. Пользователь может сохранить захваченное изображение в графический файл, поддерживаемый инструментарием ImageMagick, который поддерживает большинство (если не все) популярные графические форматы. MagiCapture использует библиотеки GLIB и GTK + для пользовательского интерфейса и библиотеки ImageMagick и GdkMagick для всей обработки графики. Требуется ImageMagick.

ИЛИ ЖЕ

ZScreen: - Это приложение для захвата экрана только для Windows имеет множество функций. Он захватывает снимок активного окна, выбранного окна или всего экрана. Однажды ты'Получив изображение, автоматически откройте его в редакторе изображений или загрузите в Twitpic, YFrog, Flickr или в одну из нескольких поддерживаемых служб. ZScreen кэширует все ваши изображения, даже те, что находятся в буфере обмена, так чтоs всегда история ваших скриншотов прямо у вас под рукой.

Решение Вопроса

Это возможно с помощьюVirtualGL на сервере с аппаратным ускорением. В основном просто настройте сервер соответствующим образом, затем либо на том же компьютере, либо на компьютере в той же сети, запустите

export DISPLAY=<your xvfb="" display="">
vglrun <your_app>
</your_app></your>

Это будет иметь следующие преимущества:

1) ваше приложение будет отображаться с использованием virtualGL, который будет использовать аппаратное обеспечение

2) VirtualGL отобразит ваш 3D-контекст на дисплее Xfvb, который будет отображать только 2D-виджеты в CPU

3) настроить Xvfb для рендеринга в кадровый буфер

4) прибыль!

 lurscher29 нояб. 2012 г., 16:50
это очень интересно! спасибо, я рассмотрю и попробую настроить

но я предполагаю, что вы можете использовать x11vnc с опцией -id [windowid] (http://www.karlrunge.com/x11vnc/x11vnc_opts.html#opt-id) для потоковой передачи этого единственного окна через VNC , Это покажет вам все окно с тем же позиционированием, что и на главном экране (вы можете потерять некоторые всплывающие меню), даже если оно закрыто. Вы можете получить координаты окна с истинного экрана X11.

gnome-screenshotили какой-либо другой существующий инструмент с открытым исходным кодом, и выясните, как они это делают.

Вы можете найти источники, которые использует Ubuntu здесь:http://packages.ubuntu.com/quantal/gnome-screenshot

Но нене забудьте проверить лицензию, прежде чем вырезать и вставлять большие фрагменты кода!

Ваш ответ на вопрос