在Linux上的屏幕捕获最快方法(Fastest method for screen capturi

2019-07-04 00:11发布

这个问题是与此类似

屏幕捕获的最快方法

但为Linux / X11。

更具体而言,我需要一个方法来捕获一个窗口(ALT-打印屏幕的窗口中的编程当量)运行的像素图像上的X11 diplay。

注意事项和要求:

1)即使被放置在正被捕获的窗口的顶部一个新的窗口,所述像素图像还是应该指向原始应用程序窗口而没有任何阻塞

2)它不需要要由用户看到的应用程序窗口,我只需要存储像素缓冲器/图像作为视频显示用

我已经探索其他替代方案是:

1)xvfb的 - 它的工作原理,但它确实做CPU的渲染,这是缓慢的,浪费了良好的GPU

2)许多LXC内部X11 - 理论上可以工作,但很复杂的设置,我不知道它会与正在拍摄的许多窗户很好地扩展

建议和想法,欢迎

Answer 1:

这是可能的使用VirtualGL在硬件加速的服务器。 基本上只是配置服务器appropiately,然后在同一计算机上或在同一网络中的机器上,运行

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

这将具有以下优点:

1)您的应用程序将呈现使用virtualGL,这将使用硬件

2)VirtualGL将显示您的3D上下文Xfvb显示器内部,这将仅呈现CPU二维窗口小部件

3)配置的Xvfb渲染到帧缓冲

4)利润!



Answer 2:

这是不可能的纯X11。

你可以得到你想要合成的东西,但只支持它(最现代的做)的服务器。 这实际上无关与窗口管理器。 一个WM只是另一种客户端,尽管有一些特殊能力,但这些都是无关的合成。 您可以使用相同的合成API。

man xcomposite应该让你开始。



Answer 3:

您可以使用XWD(1)转储X11窗口(和xwud(1) ,以显示它)。 ImageMagick的和NetPBM的工具,知道如何处理与XWD格式。 但这些都不是特别快。 他们不会透露窗口的隐藏部分。



Answer 4:

我抢来源gnome-screenshot ,或其他一些现有的开放源代码工具,并找出他们是如何做到这一点。

你可以找到来源Ubuntu使用这里: http://packages.ubuntu.com/quantal/gnome-screenshot

但是,不要忘记检查许可证,切断之前和粘贴大段代码!



Answer 5:

我见过的评论说,这不能在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);
}


Answer 6:

这只是胡乱猜测,但我相信你可以使用x11vnc带有-ID [WINDOWID(http://www.karlrunge.com/x11vnc/x11vnc_opts.html#opt-id)选项以流过VNC是单一窗口。 这将显示整个窗口,具有完全相同的定位在主屏幕(你可能会失去一些弹出菜单),即使它被覆盖。 您可以获取窗口从真正的X11屏幕坐标。



Answer 7:

Xpaint是使用MIT雅典娜widget集建立了一个很老的X11程序。 文件>执行快照将抓住从屏幕窗口或鼠标选择的矩形。

要么

MagiCapture是X Window系统屏幕捕获和预览工具。 用户可以捕获一个窗口,具有装饰的单个窗口中,显示的矩形区域或整个显示器本身。 用户可以在拍摄图像保存到由ImageMagick的工具箱支持一个图形文件,它支持大多数(如果不是全部)流行的图形格式。 MagiCapture使用用于用户界面和所述的ImageMagick和GdkMagick库所有图形处理油嘴和GTK +库。 需要ImageMagick的。

要么

Zscreen : -这仅限Windows屏幕捕获应用程序有大量的特性。 它抓住一个镜头的活动窗口,被选择窗口,或整个屏幕。 一旦你的图像,自动图像编辑器中打开它,或者把它上传到Twitpic,YFrog,Flickr的,或其他一些支持的服务之一。 ZScreen缓存所有的图片,在剪贴板甚至是那些,所以总是有你的截图历史就在你的指尖。



Answer 8:

你可以用你的本地网络中的棘手黑客要做的是使用X远程功能打开X监听端口,然后使用的环境变量设置导出到X监听端口,然后用XscreenCapture



文章来源: Fastest method for screen capturing on Linux