Come acquisire uno screenshot di una GUI basata su X11 da un terminale di testo (come tty1)?


11

Ho provato a usare DISPLAY=:0 import -window root "$HOME/Pictures/screenshot.png"( importfa parte della suite ImageMagick), ma questo visualizza solo una schermata nera.

Voglio farlo poiché volevo automatizzare l'apertura di un'app e catturarne screenshot in diverse lingue e, per cambiare lingua, ho bisogno di riavviare lightdm. quindi, esegui su un tty in modo che il tuo script continui a funzionare ...

Risposte:


10

Oltre alle risposte esistenti, per visualizzare lo screenshot in ASCII nel terminale:

xwd -root -display :0 | convert - jpg:- | jp2a - --colors

(Richiede x11-appsper xwd, imagemagickper converte jp2a.)


Aggiunta non esattamente pertinente, ma interessante.
Yatharth Agarwal,

1
xwd -root -display :0 | convert - jpg:- > screenshot.jpg
Gregn3,

2
Le moderne versioni di ImageMagick spesso non possono inferire il xwdformato dai numeri magici, quindi è meglio specificare esplicitamente il formato di input: xwd -root -display :0 | convert xwd:- jpg:- | jp2a - --colors
Bass

Per me xwd -name "$win_name" | convert xwd:- /tmp/"$win_name".pngwin_name=$(xwininfo -tree -root | grep 'The Window Name Im Looking For' | awk -F\" '{print $2}')
:,


5

Ecco cosa ha funzionato per me.

chvt 7
DISPLAY=:0 import -window root "$HOME/Pictures/screenshot.png
chvt 1

5

Prova a utilizzare l'otturatore

DISPLAY=:0 shutter -f -e -n -o "$HOME/Pictures/screenshot.png"

L'importazione non funzionerà perché la finestra principale non è in uso. La composizione "la ignora" (ogni finestra viene renderizzata nel suo buffer, quindi multiplexata al display, invece del vecchio modo, dove erano tutti renderizzati nella finestra "root").

Inoltre, è necessario assicurarsi che VTY sia attivo prima di acquisire lo screenshot. Quindi per esempio,

#!/bin/bash  
X :1 &  
export DISPLAY=:1  
sleep 10 # give time for X to start  
gedit &  
sleep 10 # give time for app to do something  
chvt 8  # ensure the X display is active  
shutter -f -e -n -o "$HOME/Pictures/screenshot.png" # screenshot  
killall xorg # terminate X

No, continua a dare uno schermo nero :(
Yatharth Agarwal l'

Sei nella sessione X (su un monitor) quando lo fai. Ho appena provato e ha funzionato abbastanza bene. Sarà necessario aver effettuato l'accesso e avere la sessione X nel VTY attivo.
Coteyr,

Voglio uno script lanciato nel tty per poterlo fare.
Yatharth Agarwal,

Sì, ma passi alla sessione X prima di scattare la schermata. X :0 & sleep 50 && sudo chvt 6 && program & sleep 5 && screenshot(nota la sceneggiatura totalmente falsa).
Coteyr,

Anche solo per essere sicuro di parlare della stessa cosa che vuoi VT0 (o qualcosa del genere) non una schermata di una console di testo. Quindi esegui lo script da un TTY cercando di schermare X (VTY). È corretto?
Coteyr,

0

Stare seduti sullo stesso computer e farlo da un terminale virtuale diverso da quello in esecuzione sul server X non funziona.

È spiegato qui: http://www.karlrunge.com/x11vnc/faq.html#faq-linuxvc . Citazione:

D-108: Uso Linux Virtual Terminals (VT's) per implementare il "Cambio rapido utente" tra le sessioni degli utenti (ad es. Betty è su Ctrl-Alt-F7, Bobby è su Ctrl-Alt-F8 e Sid è su Ctrl-Alt -F1: usano quei tasti per passare da una sessione all'altra. Come mai la vista in un visualizzatore VNC che si connette a x11vnc è completamente nera, non si aggiorna o i pixel sono incasinati a meno che la sessione X a cui x11vnc non sia collegata sia nel VT attivo?

Questo sembra avere a che fare con il modo in cui le applicazioni (i processi del server X in questo caso) devono "giocare bene" se non si trovano sul VT attivo (a volte chiamato VC per console virtuale.) Cioè, non dovrebbero leggere dalla tastiera o mouse o gestisci il display video a meno che non abbiano il VT attivo. Dato che sembra che la chiamata XGetImage () debba in definitiva recuperare i dati del framebuffer dall'hardware video stesso, avrebbe senso che il polling di x11vnc non funzionasse a meno che la sessione X non avesse il controllo attivo del VT.

Non sembra esserci un modo semplice per aggirare questo problema. Anche xwd (1) non funziona in questo caso (provalo.) Qualcosa dovrebbe essere fatto a un livello inferiore, diciamo nel server XFree86 / Xorg X. Inoltre, l'utilizzo di Shadow Framebuffer (una copia del framebuffer video viene conservato nella memoria principale) non sembra risolvere il problema (ultimo controllo 2007.)

Se nessuno è seduto sulla postazione di lavoro e si desidera semplicemente passare da remoto il VT a quello associato alla propria sessione X (in modo che x11vnc possa eseguirne il polling correttamente), si può usare il comando chvt (1), ad esempio "chvt 7" per VT # 7.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.