Wie mache ich einen Screenshot aus einem Fenster mit anpassbaren Rändern?

17

Ich benötige ein Tool, das Folgendes ausführt: Wenn Sie ein Fenster auswählen, wird ein Screenshot dieses Fensters mit einem x- Abstand erstellt, wie im folgenden Bild dargestellt:

Also, in den meisten Fällen ist x gleich y , aber manchmal brauche ich unterschiedliche Abstände.

Wie macht man so einen Screenshot automatisch? Ich habe es mit Shutter versucht, aber ich konnte dort keine solche Einstellung finden. Es werden jedoch Plugins unterstützt. Ein Plugin könnte also sein, das Fenster auf diese Weise zuzuschneiden.

Ionică Bizău
quelle
Kann ich fragen, mit welchem ​​Tool Sie dieses Modell erstellt haben? Es sieht ganz gut aus :)
Seth
1
@Seth InkScape Regeln! Ich bin kein Experte, aber ich mag es solche Sachen für meine Projekte zu erstellen. Es sieht gut aus für die Augen. :-) Hier ist die PNG-Version und die SVG- Version . Dieses Repository enthält andere Inhalte, die mit InkScape erstellt wurden.
Ionică Bizău

Antworten:

19

Skript mit Shutter

Ich glaube nicht, dass es existiert, aber wie alles andere kann es gemacht werden.

Wenn Sie das unten stehende Skript unter einer Tastenkombination verfügbar machen (Erklärung weiter unten), öffnet sich ein Fenster, in dem Sie die Ränder Ihres Screenshots links, rechts, oben und unten durch ein Leerzeichen voneinander trennen können:

Bildbeschreibung hier eingeben

Ergebnis:

Bildbeschreibung hier eingeben

oder:

Bildbeschreibung hier eingeben

Ergebnis:

Bildbeschreibung hier eingeben

etc.

Ich habe den Standardwert auf 30 px festgelegt, aber Sie können einen beliebigen Standardwert festlegen (siehe unten).

Wie benutzt man

  • Das Skript verwendet Shutterund wmctrl. Angenommen, Shutterauf Ihrem System ist bereits Folgendes installiert (seitdem Sie es erwähnt haben) wmctrl:

    sudo apt-get install wmctrl
    

    NB Wenn Sie Kubuntu verwenden , Zenityist standardmäßig nicht installiert:

    sudo apt-get install zenity
    
  • Kopieren Sie das folgende Skript in eine leere Datei. Wenn Sie möchten, können Sie den "Standard" Rand in der Zeile des Skripts ändern:

    `arg =`
    
  • Speichern Sie es als custom_screenshot.py.

  • Fügen Sie das Skript einer Tastenkombination hinzu: Wählen Sie: Systemeinstellungen> "Tastatur"> "Verknüpfungen"> "Benutzerdefinierte Verknüpfungen". Klicken Sie auf das "+" und fügen Sie den Befehl hinzu:

    python3 /path/to/custom_screenshot.py
    

Hinweis

Das Skript wmctrlbestimmt die Position des Fensters. Bei verschiedenen Fenstermanagern wmctrl -lGzeigt die Ausgabe des Befehls jedoch kleine Unterschiede in der y-Position des Fensters. Diese Unterschiede werden durch den Wert beseitigt, der in der deviation=-Zeile des Skripts festgelegt ist. Der aktuell eingestellte Wert (0) ist für Unity und KDE geeignet.

Das Skript wird ebenfalls getestet und funktioniert einwandfrei mit Xfceund Gnome, aber der Wert muss dann geändert werden, wie im Abschnitt head des Skripts erläutert.

Das Drehbuch

#!/usr/bin/env python3
import subprocess
import time

"""
On different window managers, the window geometry as output of wmctrl differs slightly.
The "deviation" should compensate these differences. Most likely appropriate (tested) settings:
Unity: 0, Gnome: -36, Xfce (Xubuntu): -26, KDE (Kubuntu): 0
"""
#---
deviation = 0
#---
get = lambda cmd: subprocess.check_output(["/bin/bash", "-c", cmd]).decode("utf-8")
try:
    arg = get('zenity --entry --entry-text "30 30 30 30" --text "border left, right, top, bottom" --title "Screenshot margins"').strip().split()
except:
    pass
else:
    time.sleep(0.5)
    # frontmost window pos
    frontmost = [l.split()[4] for l in get("xprop -root").splitlines() if "ACTIVE_WINDOW(WINDOW)" in l][0].replace(",", "")
    frontmost = frontmost[:2]+"0"+frontmost[2:]
    f_data = [l.split() for l in get("wmctrl -lG").splitlines() if frontmost in l][0][2:6]
    # extent
    xt_data = get("xprop -id "+frontmost).split()
    xt_i = xt_data.index("_NET_FRAME_EXTENTS(CARDINAL)")
    xt = [int(n.replace(",", "")) for n in xt_data[xt_i+2:xt_i+6]]
    # set data for screenshot command
    x = str(int(f_data[0])-int(arg[0])-xt[0])
    y = str(int(f_data[1])-int(arg[2])-xt[2]+deviation)
    w = str(int(f_data[2])+int(arg[0])+int(arg[1])+xt[0]+xt[1])
    h = str(int(f_data[3])+int(arg[3])+int(arg[2])+xt[2]+xt[3])

    command = "shutter -s="+(",").join([x,y,w,h])+" -e"
    subprocess.call(["/bin/bash", "-c", command])
Jacob Vlijm
quelle
3
Ich glaube nicht, dass es existiert - jetzt existiert es! Vielen Dank!
Ionică Bizău
1
@ IonicăBizău gern geschehen! Danke für die Frage, es hat Spaß gemacht. Ich habe eine kleine Korrektur an der Erklärung der Standardeinstellungen vorgenommen.
Jacob Vlijm
1
@IonicăBizău hat einen Fehler in der Geometrie gefunden (und behoben).
Jacob Vlijm
2
Gut gut gut! Ich habe es als den Befehl festgelegt, den ich ausführe, wenn ich die Sondertaste auf meinem ASUS-Notebook drücke. :-)
Ionică Bizău
2

Sie können auch eine Kombination der Schaltflächen Shift und PrtScr verwenden , um einen Screenshot eines bestimmten Bereichs mit benutzerdefinierten Abmessungen zu erstellen .

Drücken Sie einfach die Kombination und wählen Sie mit dem geänderten Cursor (ähnlich einem Pluszeichen) den Bereich für den Screenshot aus.

manishraj2011
quelle
Normalerweise kann ich meine Hände nicht steuern, um diese Ränder genau einzustellen. :-) Aber +1 für diese Verknüpfung, ich wusste es nicht.
Ionică Bizău
2

Sie können Screenshots mit dem scrotKommandozeilen-Dienstprogramm machen:

scrot -s  

oder

scrot -ub -d 5  

Mit dem zweiten Befehl wird das ausgewählte Fenster mit einem Rahmen versehen, der im Verhältnis zur Fenstergröße eine schöne Breite hat. Die -d 5Option steht für Verzögerung und gibt Ihnen eine Verzögerung von 5 Sekunden, um das Fenster auszuwählen, das im Screenshot angezeigt werden soll.

Installieren Sie mit diesem:

sudo apt-get install scrot

Referenz: Ubuntu Manual - scrot

Tim
quelle