Como tirar uma captura de tela de uma GUI baseada em X11 a partir de um terminal de texto (como o tty1)?


11

Tentei usar DISPLAY=:0 import -window root "$HOME/Pictures/screenshot.png"( importfaz parte da suíte ImageMagick), mas isso apenas exibe uma tela preta.

Eu quero fazer isso como eu queria automatizar a abertura de um aplicativo e tirar capturas de tela dele em diferentes idiomas. Para mudar o idioma, preciso reiniciar o lightdm. portanto, execute em um tty para que seu script continue em execução ...

Respostas:


10

Além das respostas existentes, para exibir a captura de tela em ASCII no terminal:

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

(Requer x11-appspara xwd, imagemagickpara converte jp2a.)


Não é exatamente relevante, mas é uma adição legal.
Yatharth Agarwal

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

2
Modernos ImageMagick versões muitas vezes não se pode inferir o xwdformato de números mágicos, por isso é melhor para especificar o formato de entrada explicitamente: xwd -root -display :0 | convert xwd:- jpg:- | jp2a - --colors
Baixo

Para mim 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

Aqui está o que funcionou para mim.

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

5

Tente usar o obturador

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

A importação não funcionará, porque a janela raiz não está em uso. A composição "ignora" isso (cada janela é renderizada em seu próprio buffer e multiplexada para a exibição, em vez da maneira antiga, onde todas foram renderizadas na janela "raiz").

Além disso, você precisa garantir que o VTY esteja ativo antes de fazer a captura de tela. Então, por exemplo,

#!/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

Não, ainda está dando uma tela preta :(
Yatharth Agarwal 8/08/12

Você está na sessão X (em um monitor) quando faz isso. Eu apenas tentei e funcionou muito bem. Você precisará estar logado e ter a sessão X no VTY ativo.
coteyr

Eu quero que um script lançado no tty seja capaz de fazer isso.
Yatharth Agarwal

Sim, mas você muda para a sessão X antes de tirar a captura de tela. X :0 & sleep 50 && sudo chvt 6 && program & sleep 5 && screenshot(observe script totalmente falso).
coteyr

Além disso, apenas para ter certeza de que você está falando a mesma coisa que deseja que o VT0 (ou algo assim) não seja uma captura de tela de um console de texto. Então você está executando o script de um TTY tentando capturar a tela X (VTY). Isso está correto?
coteyr

0

Sentar no mesmo computador e fazê-lo em um terminal virtual diferente do servidor X não está funcionando.

É explicado aqui: http://www.karlrunge.com/x11vnc/faq.html#faq-linuxvc . Citar:

Q-108: Eu uso os terminais virtuais (VTs) do Linux para implementar a 'Troca rápida de usuário' entre as sessões dos usuários (por exemplo, Betty está em Ctrl-Alt-F7, Bobby está em Ctrl-Alt-F8 e Sid está em Ctrl-Alt -F1: eles usam essas teclas para alternar entre as sessões.) Como a exibição em um visualizador de VNC que se conecta ao x11vnc é completamente preta, não é atualizada ou os pixels são alterados, a menos que a sessão X x11vnc esteja anexada VT ativo?

Isso parece ter a ver com a maneira como os aplicativos (o servidor X processa neste caso) devem "funcionar bem" se não estiverem no VT ativo (às vezes chamado de VC para console virtual). Ou seja, eles não devem ler no teclado ou mouse ou gerencie a exibição de vídeo, a menos que eles tenham o VT ativo. Dado que parece que a chamada XGetImage () deve finalmente recuperar os dados do buffer de quadros do próprio hardware de vídeo, faria sentido que a pesquisa do x11vnc não funcionasse, a menos que a sessão X tivesse controle ativo do VT.

Não parece haver uma maneira fácil de solucionar isso. Até o xwd (1) não funciona nesse caso (tente). Algo precisaria ser feito em um nível mais baixo, digamos no servidor XFree86 / Xorg X. Além disso, o uso do Shadow Framebuffer (uma cópia do framebuffer de vídeo é mantida na memória principal) não parece corrigir o problema (última verificação em 2007.)

Se ninguém estiver sentado na estação de trabalho e você quiser alternar remotamente o VT para aquele associado à sua sessão X (para que o x11vnc possa pesquisá-lo corretamente), pode-se usar o comando chvt (1), por exemplo, "chvt 7" para VT # 7.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.