32

この質問はこれに似ています

画面キャプチャの最速の方法

ただし、Linux/X11 の場合。

より具体的には、X11 ディスプレイで実行されている 1 つのウィンドウ (Windows の代替印刷画面に相当するプログラム) のピクセル イメージをキャプチャする方法が必要です。

注意事項と要件:

1) キャプチャされているウィンドウの上に新しいウィンドウが配置されている場合でも、ピクセル イメージは、オクルージョンなしで元のアプリケーション ウィンドウを指している必要があります。

2) アプリケーション ウィンドウがユーザーに表示される必要はありません。ビデオ目的でピクセル バッファー/画像を保存する必要があるだけです。

私が調査した他の選択肢は次のとおりです。

1) xvfb - 動作しますが、CPU レンダリングを行います。これは遅く、優れた GPU を浪費します。

2) 多くの lxc 内の x11 - 理論的には動作する可能性がありますが、セットアップが複雑であり、多くのウィンドウがキャプチャされるとうまくスケーリングされるかどうかはわかりません

提案やアイデアは大歓迎です

4

8 に答える 8

9

これは、ハードウェア アクセラレーションを備えたサーバーでVirtualGLを使用することで可能になります。基本的には、サーバーを適切に構成するだけで、同じマシンまたは同じネットワーク内のマシンで実行します

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

これには次の利点があります。

1) アプリはハードウェアを使用する virtualGL を使用してレンダリングします。

2) VirtualGL は、CPU で 2D ウィジェットのみをレンダリングする Xfvb ディスプレイ内に 3D コンテキストを表示します。

3) フレームバッファにレンダリングするように Xvfb を構成する

4) お得!

于 2012-11-29T15:48:04.050 に答える
8

これは純粋な X11 では不可能です。

合成で必要なものを得ることができますが、それをサポートするサーバーでのみ可能です (ほとんどの最新のサーバーはサポートしています)。これは実際にはウィンドウマネージャーとは何の関係もありません。WM は、いくつかの特別な機能を備えているとはいえ、クライアントの 1 つにすぎませんが、それらは合成とは関係ありません。同じ合成 API を使用できます。

man xcomposite始める必要があります。

于 2012-11-22T19:08:35.633 に答える
3

xwd(1)を使用して X11 ウィンドウをダンプできます (およびxwud(1)を使用して表示できます)。ImageMagickNetpbm ツールは、XWD フォーマットの処理方法を知っています。しかし、これらは特に高速ではありません。また、ウィンドウの隠れた部分は表示されません。

于 2012-11-28T02:45:00.477 に答える
3

これは 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);
}
于 2018-12-28T22:32:38.000 に答える
1

gnome-screenshotや他の既存のオープンソース ツールのソースを入手して、それがどのように行われるかを理解します。

Ubuntu が使用するソースは、http: //packages.ubuntu.com/quantal/gnome-screenshotで見つけることができます。

ただし、コードの大部分をカット アンド ペーストする前に、ライセンスを確認することを忘れないでください。

于 2012-11-29T13:19:39.453 に答える
1

これは単なる推測ですが、x11vnc を -id [windowid] (http://www.karlrunge.com/x11vnc/x11vnc_opts.html#opt-id) オプションとともに使用して、その単一のウィンドウを VNC 経由でストリーミングできると思います。 . これにより、メイン画面とまったく同じ位置でウィンドウ全体が表示されます (ポップアップ メニューがいくつか失われる可能性があります)。真の X11 画面からウィンドウ座標を取得できます。

于 2012-11-29T13:34:40.583 に答える
0

ローカルネットワークでのトリッキーなハックでできることは、Xリモート機能を使用してXリッスンポートを開き、env varを使用してエクスポートをXリッスンポートに設定してから、XscreenCaptureを使用することです。

于 2012-11-29T15:31:32.983 に答える
0

Xpaint は、MIT Athena ウィジェット セットを使用して構築された非常に古い X11 ユーティリティです。File > Take Snapshot は、画面からウィンドウまたはマウスで選択した長方形を取得します。

また

MagiCapture は、X Window System 用のスクリーン キャプチャおよびプレビュー ユーティリティです。ユーザーは、単一のウィンドウ、装飾が施された単一のウィンドウ、ディスプレイの長方形の領域、またはディスプレイ自体全体をキャプチャできます。ユーザーはキャプチャした画像を ImageMagick ツールキットでサポートされているグラフィック ファイルに保存できます。ImageMagick ツールキットは、ほとんどの (すべてではないにしても) 一般的なグラフィック形式をサポートしています。MagiCapture は、ユーザー インターフェイスに GLIB および GTK+ ライブラリを使用し、すべてのグラフィック処理に ImageMagick および GdkMagick ライブラリを使用します。ImageMagick が必要です。

また

Zscreen :- この Windows 専用のスクリーン キャプチャ アプリには、たくさんの機能があります。アクティブなウィンドウ、選択したウィンドウ、または画面全体のショットを取得します。画像を取得したら、画像エディターで自動的に開くか、Twitpic、YFrog、Flickr、またはその他のサポートされているサービスのいずれかにアップロードします。ZScreen は、クリップボードにあるものも含め、すべての画像をキャッシュするため、スクリーンショットの履歴をいつでもすぐに確認できます。

于 2012-11-29T15:25:04.487 に答える