web-dev-qa-db-fra.com

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

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

Je souhaite le faire car je souhaitais automatiser l'ouverture d'une application et en prendre des captures d'écran dans différentes langues. Pour changer de langue, je dois redémarrer lightdm. donc, exécutez sur un tty pour que votre script continue à s'exécuter ...

11
Yatharth Agarwal

Voici ce qui a fonctionné pour moi.

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

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

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

(Nécessite x11-apps pour xwdname__, imagemagickpour convertet jp2a.)

10
Niklas

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

 xwd -root -out screenshot.xwd

Le fichier screenshot.xwd peut être ouvert avec GIMP:

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

6
rendon

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 restituée dans son propre tampon puis multiplexée à l’affichage, au lieu de l’ancienne, où elles étaient toutes restituées dans la fenêtre "racine").

De plus, vous devez vous assurer que le VTY est actif avant de prendre la capture d'écran. Donc 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
5
coteyr

Il n’est pas possible de rester assis sur le même ordinateur et de le faire depuis un terminal virtuel différent de celui utilisé par le serveur X.

C'est expliqué ici: http://www.karlrunge.com/x11vnc/faq.html#faq-linuxvc . Citation:

Q-108: J'utilise des terminaux virtuels Linux (VT) pour implémenter le "Changement rapide d'utilisateur" 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 passer d’une session à l’autre.) Comment se fait-il que la vue dans une visionneuse VNC se connectant à x11vnc soit complètement noire, n mise à jour, ou pixels défectueux à moins que la session X x11vnc soit attachée soit dans le VT actif?

Cela semble avoir à voir avec la façon dont les applications (les processus du serveur X dans ce cas) doivent "bien jouer" si elles ne sont pas sur le VT actif (parfois appelées VC pour la console virtuelle). ne doit pas lire à partir du clavier ou de la souris, ni gérer l’affichage vidéo à moins de disposer du terminal virtuel actif. Etant donné qu'il apparaît que l'appel XGetImage () doit en fin de compte récupérer les données du framebuffer à partir du matériel vidéo lui-même, il serait logique que l'interrogation de x11vnc ne fonctionne pas à moins que la session X ait 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.) Il faudrait faire quelque chose à un niveau inférieur, par exemple sur le serveur XFree86/Xorg X. De plus, l'utilisation du framebuffer de Shadow (une copie du framebuffer de la 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 ne se trouve sur le poste de travail et que vous souhaitez simplement basculer le VT à distance vers 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.

0
Golar Ramblar