Comment faire une capture d'écran d'une interface graphique basée sur X11 à partir d'un terminal texte (tel que tty1)?

11

J'ai essayé d'utiliser DISPLAY=:0 import -window root "$HOME/Pictures/screenshot.png"( importfait partie de la suite ImageMagick), mais cela n'affiche qu'un écran noir.

Je veux le faire car je voulais automatiser l'ouverture d'une application et en faire des captures d'écran dans différentes langues, et pour changer de langue, je dois redémarrer lightdm. par conséquent, exécutez sur un tty pour que votre script continue de s'exécuter ...

Yatharth Agarwal
la source

Réponses:

10

En plus des réponses existantes, pour afficher la capture d'écran en ASCII dans le terminal:

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

(Requiert x11-appspour xwd, imagemagickpour convertet jp2a.)

Niklas
la source
Pas exactement pertinent, mais un ajout sympa.
Yatharth Agarwal
1
xwd -root -display :0 | convert - jpg:- > screenshot.jpg
gregn3
2
Les versions modernes d' ImageMagick ne peuvent souvent pas déduire le xwdformat à partir de nombres magiques, il est donc préférable de spécifier explicitement le format d'entrée: xwd -root -display :0 | convert xwd:- jpg:- | jp2a - --colors
Bass
Pour moi 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}')
:,
6

Voici une solution utilisant xwd, qui est disponible dans presque toutes les installations Xorg:

 xwd -root -out screenshot.xwd

Le screenshot.xwdfichier peut être ouvert avec GIMP:

Pour plus d'informations, voir http://www.x.org/wiki/UserDocumentation/GettingStarted/ .

rendon
la source
5

Voici ce qui a fonctionné pour moi.

chvt 7
DISPLAY=:0 import -window root "$HOME/Pictures/screenshot.png
chvt 1
Yatharth Agarwal
la source
5

Essayez d'utiliser l'obturateur

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

L'importation ne fonctionnera pas, car la fenêtre racine n'est pas utilisée. La composition la "contourne" (chaque fenêtre est rendue dans son propre tampon puis multiplexée sur l'affichage, au lieu de l'ancienne manière, où elles étaient toutes rendues sur la fenêtre "racine").

De plus, vous devez vous assurer que le VTY est actif avant de prendre la capture d'écran. Ainsi, par exemple,

#!/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
coteyr
la source
Non, donnant toujours un écran noir :(
Yatharth Agarwal
Êtes-vous dans la session X (sur un moniteur) lorsque vous effectuez cette opération. J'ai juste essayé et cela a plutôt bien fonctionné. Vous devrez être connecté et avoir la session X dans le VTY actif.
coteyr
Je veux qu'un script lancé dans le tty puisse le faire.
Yatharth Agarwal
Oui, mais passez-vous à la session X avant de prendre la capture d'écran. X :0 & sleep 50 && sudo chvt 6 && program & sleep 5 && screenshot(remarquez un faux script).
coteyr
Aussi juste pour vous assurer que vous parliez de la même chose que vous voulez VT0 (ou quelque chose) pas une capture d'écran d'une console texte. Donc, vous exécutez le script à partir d'un TTY essayant de faire une capture d'écran X (VTY). Est-ce exact?
coteyr
0

S'asseoir sur le même ordinateur et le faire à partir d'un terminal virtuel différent de celui du serveur X ne fonctionne pas.

Il y est expliqué: http://www.karlrunge.com/x11vnc/faq.html#faq-linuxvc . Citation:

Q-108: J'utilise Linux Virtual Terminals (VT) pour implémenter le «Fast User Switching» entre les sessions des utilisateurs (par exemple, Betty est sur Ctrl-Alt-F7, Bobby est sur Ctrl-Alt-F8 et Sid est sur Ctrl-Alt -F1: ils utilisent ces touches pour basculer entre leurs sessions.) VT actif?

Cela semble avoir à voir avec la façon dont les applications (les processus du serveur X dans ce cas) doivent "jouer correctement" si elles ne sont pas sur le VT actif (parfois appelé VC pour console virtuelle). Autrement dit, elles ne devraient pas lire à partir du clavier. ou la souris ou gérer l'affichage vidéo à moins qu'ils aient le VT actif. Étant donné qu'il semble que l'appel XGetImage () doit finalement récupérer les données du framebuffer du matériel vidéo lui-même, il serait logique que l'interrogation de x11vnc ne fonctionne que si la session X a le contrôle actif du VT.

Il ne semble pas y avoir de moyen facile de contourner ce problème. Même xwd (1) ne fonctionne pas dans ce cas (essayez-le). Quelque chose devrait être fait à un niveau inférieur, par exemple dans le serveur XFree86 / Xorg X. De plus, l'utilisation du Shadow Framebuffer (une copie du framebuffer vidéo est conservée dans la mémoire principale) ne semble pas résoudre le problème (dernière vérification en 2007.)

Si personne n'est assis sur le poste de travail et que vous souhaitez simplement basculer à distance le VT sur celui associé à votre session X (pour que x11vnc puisse l'interroger correctement), vous pouvez utiliser la commande chvt (1), par exemple "chvt 7" pour VT # 7.

Golar Ramblar
la source