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 ...

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.)


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}')
:,


5

Voici ce qui a fonctionné pour moi.

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

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

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.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.