Schnellste Methode zur Bildschirmaufnahme unter Linux

Lesezeit: 6 Minuten

Benutzer-Avatar
lurscher

Diese Frage ähnelt dieser

Schnellste Methode zur Bildschirmaufnahme

aber für Linux/X11.

Um genauer zu sein, brauche ich eine Methode, um die Pixelbilder eines Fensters (das programmatische Äquivalent des Alt-Print-Bildschirms in Windows) zu erfassen, das auf einem X11-Display ausgeführt wird.

Hinweise und Anforderungen:

1) Auch wenn ein neues Fenster über dem erfassten Fenster platziert wird, sollte das Pixelbild immer noch ohne jegliche Okklusion auf das ursprüngliche Anwendungsfenster zeigen

2) Es ist nicht erforderlich, dass das Anwendungsfenster vom Benutzer gesehen wird, ich muss nur die Pixelpuffer/Bilder für Videozwecke speichern

Andere Alternativen, die ich untersucht habe, sind:

1) xvfb – es funktioniert, aber es macht CPU-Rendering, was langsam und verschwenderisch für eine gute GPU ist

2) x11 in vielen lxc – könnte theoretisch funktionieren, ist aber komplex einzurichten, und ich bin mir nicht sicher, ob es gut skaliert, wenn viele Fenster erfasst werden

Anregungen und Ideen sind willkommen

  • Wenn das Fenster abgedeckt ist, ist das, was Sie lesen, undefiniert.

    – BЈовић

    20. November 2012 um 19:22 Uhr

  • Ja, CPU-Rendering ist langsam und verschwenderisch, aber ist diese Leistung unannehmbar langsam? Wenn es sich um einen Compositing-Window-Manager handelt, können Sie je nach verwendetem Fenstermanager auch nach einer wm-spezifischen API suchen, die Ihnen einen Zeiger auf einen Off-Screen-Puffer einer Anwendung geben könnte. Alles, was Sie dann tun müssen, ist eine Kopie des Puffers zu erstellen, bevor die Anwendung sich selbst neu zeichnet.

    – Robert Maurer

    20. November 2012 um 20:14 Uhr

  • @RobertMason, das würde funktionieren, und es wäre definitiv eine gültige Antwort, wenn jemand einen Fenstermanager vorschlagen könnte, der 1) GPU-Beschleunigungs-Rendering unterstützt (ich weiß nichts über die x11-Architektur, aber ich nehme an, das geschieht durch Erweiterungen) und 2) unterstützt diese spezielle Art von API

    – lurscher

    20. November 2012 um 21:13 Uhr


  • @RobertMason, die Leistung (des Ausführens von Apps in xvfb) ist nicht unannehmbar langsam, sondern gerade langsam genug, sodass es sich lohnt, Zeit mit der Suche nach Alternativen zu verbringen

    – lurscher

    20. November 2012 um 21:18 Uhr

  • Sie können wmctrl oder xdotool verwenden, um ein Fenster zu aktivieren, wenn dies akzeptabel ist, auch xwininfo ist nützlich, um die Fenster-ID für xwd zu erhalten (wenn Sie xwd verwenden, geben Sie es an > name.xwd aus und einige Bildprogramme können es nativ öffnen).

    – Technosaurus

    29. November 2012 um 4:07 Uhr

Dies ist möglich mit VirtualGL in einem Server mit Hardwarebeschleunigung. Im Grunde nur den Server entsprechend konfigurieren, dann entweder auf der gleichen Maschine oder auf einer Maschine im selben Netzwerk laufen lassen

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

Dies wird die folgenden Vorteile haben:

1) Ihre App wird mit virtualGL gerendert, das die Hardware verwendet

2) VirtualGL zeigt Ihren 3D-Kontext innerhalb der Xfvb-Anzeige an, die nur die 2D-Widgets in der CPU rendert

3) Konfigurieren Sie Xvfb so, dass es in einen Framebuffer gerendert wird

4) Gewinn!

  • das ist sehr interessant! Danke, ich werde es überprüfen und versuchen, es zu konfigurieren

    – lurscher

    29. November 2012 um 15:50 Uhr

Dies ist mit reinem X11 nicht möglich.

Sie können mit Compositing bekommen, was Sie wollen, aber nur auf Servern, die es unterstützen (die meisten modernen tun es). Das hat eigentlich nichts mit Fenstermanagern zu tun. Ein WM ist nur ein weiterer Client, wenn auch mit einigen besonderen Fähigkeiten, aber diese haben nichts mit Compositing zu tun. Sie können dieselbe Compositing-API verwenden.

man xcomposite sollte Ihnen den Einstieg erleichtern.

  • Ich habe dies auf der Compiz-Mailingliste gefragt, aber sie glauben nicht, dass es viel Sinn macht, dies vom Composite-Manager aus zu tun: listen.compiz.org/pipermail/dev/2012-November/thread.html#1545 Ich werde xcompòsite überprüfen und sehen, wohin das führt

    – lurscher

    22. November 2012 um 19:34 Uhr

  • Nun, sie scheinen mehr oder weniger dasselbe zu sagen wie ich, nur ausführlicher. Das Code-Snippet verwendet Funktionen von xcomposite.

    – n. 1.8e9-wo-ist-meine-Aktie m.

    22. November 2012 um 19:52 Uhr

Ich habe Kommentare gesehen, die besagen, dass dies in X11 nicht möglich ist, daher kann es sein, dass ich etwas nicht verstehe, aber ich kann meinen Bildschirm mit dem folgenden Code erfassen.

#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);
}

Sie können verwenden xwd(1) ein X11-Fenster ausgeben (und xwud(1) um es anzuzeigen). ImageMagick und die Netpbm-Tools wissen, wie man mit dem XWD-Format umgeht. Diese sind aber nicht besonders schnell. Und sie werden keine versteckten Teile eines Fensters enthüllen.

Dies ist nur eine wilde Vermutung, aber ich nehme an, Sie könnten x11vnc mit der -id verwenden [windowid] (http://www.karlrunge.com/x11vnc/x11vnc_opts.html#opt-id) Option, um dieses einzelne Fenster über VNC zu streamen. Dadurch wird Ihnen das gesamte Fenster mit genau der gleichen Positionierung wie im Hauptbildschirm angezeigt (Sie könnten einige Popup-Menüs verlieren), selbst wenn es verdeckt ist. Sie können die Fensterkoordinaten vom echten X11-Bildschirm abrufen.

Ich würde die Quellen für greifen gnome-screenshotoder ein anderes vorhandenes Open-Source-Tool, und finden Sie heraus, wie sie es tun.

Die Quellen, die Ubuntu verwendet, finden Sie hier: http://packages.ubuntu.com/quantal/gnome-screenshot

Vergessen Sie jedoch nicht, die Lizenz zu überprüfen, bevor Sie große Codeabschnitte ausschneiden und einfügen!

Benutzer-Avatar
Rahul Tripathi

Xpaint ist ein sehr altes X11-Dienstprogramm, das mit dem MIT Athena-Widget-Set erstellt wurde. File > Take Snapshot greift ein Fenster oder ein mit der Maus ausgewähltes Rechteck vom Bildschirm auf.

ODER

MagiCapture ist ein Bildschirmaufnahme- und Vorschauprogramm für das X Window System. Ein Benutzer kann ein einzelnes Fenster, ein einzelnes Fenster mit Dekorationen, einen rechteckigen Bereich der Anzeige oder die gesamte Anzeige selbst erfassen. Der Benutzer kann das erfasste Bild in einer Grafikdatei speichern, die vom ImageMagick-Toolkit unterstützt wird, das die meisten (wenn nicht alle) gängigen Grafikformate unterstützt. MagiCapture verwendet die Bibliotheken GLIB und GTK+ für die Benutzeroberfläche und die Bibliotheken ImageMagick und GdkMagick für die gesamte Grafikverarbeitung. Benötigt ImageMagick.

ODER

Zscreen:- Diese Bildschirmaufnahme-App nur für Windows hat unzählige Funktionen. Es nimmt eine Aufnahme des aktiven Fensters, eines ausgewählten Fensters oder des gesamten Bildschirms auf. Sobald Sie das Bild haben, öffnen Sie es automatisch in Ihrem Bildeditor oder laden Sie es auf Twitpic, YFrog, Flickr oder einen von mehreren anderen unterstützten Diensten hoch. ZScreen speichert alle Ihre Bilder, sogar die in der Zwischenablage, sodass Sie immer einen Verlauf Ihrer Screenshots direkt zur Hand haben.

1384320cookie-checkSchnellste Methode zur Bildschirmaufnahme unter Linux

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy