Jak mogę zrobić zrzut ekranu z okna z dostosowywanymi marginesami

17

Potrzebuję narzędzia, które wykona następujące czynności: wybranie okna spowoduje wykonanie zrzutu ekranu tego okna z wypełnieniem x , jak na poniższym obrazie:

Tak więc w większości przypadków x będzie równe y , ale czasami potrzebuję różnych odległości.

Jak automatycznie zrobić taki zrzut ekranu? Próbowałem z Shutter, ale nie mogłem znaleźć takiego ustawienia. Obsługuje jednak wtyczki. Wtyczka mogłaby więc przyciąć okno w ten sposób.

Ionică Bizău
źródło
Czy mogę zapytać, jakiego narzędzia użyłeś do utworzenia tej makiety? Wygląda całkiem nieźle :)
Seth
1
@Seth InkScape rządzi! Nie jestem ekspertem, ale lubię tworzyć takie rzeczy dla moich projektów. Wygląda dobrze dla oczu. :-) Oto wersja PNG i SVG . To repozytorium zawiera inne rzeczy utworzone za pomocą InkScape.
Ionică Bizău

Odpowiedzi:

19

Skrypt za pomocą migawki

Nie sądzę, że istnieje, ale jak wszystko, można to zrobić.

Jeśli udostępnisz poniższy skrypt pod kombinacją klawiszy (wyjaśnienie poniżej), pojawi się okno, w którym możesz ustawić marginesy zrzutu ekranu po lewej, prawej, górze i dole , oddzielone spacją:

wprowadź opis zdjęcia tutaj

wynik:

wprowadź opis zdjęcia tutaj

lub:

wprowadź opis zdjęcia tutaj

wynik:

wprowadź opis zdjęcia tutaj

itp.

Ustawiam domyślną wartość 30 pikseli, ale możesz ustawić dowolną wartość domyślną (patrz poniżej).

Jak używać

  • Skrypt używa Shutteri wmctrl. Zakładając, że Shutterjest już w twoim systemie (od kiedy o tym wspomniałeś), zainstaluj wmctrl:

    sudo apt-get install wmctrl
    

    Uwaga: Jeśli używasz Kubuntu , Zenitydomyślnie nie jest instalowany:

    sudo apt-get install zenity
    
  • Skopiuj poniższy skrypt do pustego pliku. Jeśli chcesz, możesz zmienić „domyślny” margines w wierszu skryptu:

    `arg =`
    
  • zapisz to jako custom_screenshot.py.

  • Dodaj skrypt do kombinacji skrótów klawiszowych: wybierz: Ustawienia systemu> „Klawiatura”> „Skróty”> „Skróty niestandardowe”. Kliknij „+” i dodaj polecenie:

    python3 /path/to/custom_screenshot.py
    

Uwaga

Skrypt używa wmctrldo określania pozycji okna. Jednak w różnych menedżerach okien dane wyjściowe wmctrl -lGpolecenia pokazują niewielkie różnice w pozycji y okna. Różnice te są eliminowane przez wartość ustawioną w deviation=linii skryptu. Aktualnie ustawiona wartość (0) jest odpowiednia dla Unity i KDE.

Skrypt jest także przetestowany i działa poprawnie na Xfcei Gnome, ale wartość musi być zmieniona, a następnie, jak wyjaśniono w sekcji head skryptu.

Scenariusz

#!/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
źródło
3
Nie sądzę, że istnieje - teraz istnieje! Dziękuję bardzo!
Ionică Bizău
1
@ IonicăBizău nie ma za co! Dzięki za pytanie, fajnie było to zrobić. Dokonałem niewielkiej korekty w wyjaśnieniu ustawień domyślnych.
Jacob Vlijm
1
@ IonicăBizău znalazł (i naprawił) błąd w geometrii.
Jacob Vlijm
2
Nieźle nieźle nieźle! Ustawiam go jako polecenie uruchamiane po naciśnięciu specjalnego przycisku na moim laptopie ASUS. :-)
Ionică Bizău
2

Możesz także użyć kombinacji przycisków Shift i PrtScr, aby wykonać zrzut ekranu określonego obszaru o wymiarach zdefiniowanych przez użytkownika.

Wystarczy nacisnąć kombinację i użyć zmodyfikowanego kursora (staje się podobny do znaku plus), aby wybrać obszar zrzutu ekranu.

manishraj2011
źródło
Zwykle nie mogę kontrolować rąk, aby dokładnie ustawić te marginesy. :-) Ale +1 dla tego skrótu, nie wiedziałem o tym.
Ionică Bizău
2

Możesz robić zrzuty ekranu za pomocą scrotnarzędzia do przechwytywania ekranu z wiersza poleceń:

scrot -s  

lub

scrot -ub -d 5  

Drugie polecenie umieszcza ramkę wokół wybranego okna, które ma niezłą szerokość w stosunku do wielkości okna. -d 5Opcja stoi za opóźnienie i daje opóźnienie 5 sekund, aby wybrać okno, aby być na zrzucie ekranu.

Zainstaluj z tym:

sudo apt-get install scrot

Odniesienie: Podręcznik Ubuntu - scrot

Tim
źródło