Bagaimana cara mengambil screenshot GUI berbasis X11 dari terminal teks (seperti tty1)?

11

Saya mencoba menggunakan DISPLAY=:0 import -window root "$HOME/Pictures/screenshot.png"( importadalah bagian dari suite ImageMagick), tetapi itu hanya menampilkan layar hitam.

Saya ingin melakukan ini karena saya ingin mengotomatiskan membuka aplikasi dan mengambil tangkapan layarnya dalam berbagai bahasa, dan untuk mengubah bahasa, saya perlu memulai ulang lightdm. karena itu, jalankan pada tty sehingga skrip Anda terus berjalan ...

Yatharth Agarwal
sumber

Jawaban:

10

Selain jawaban yang ada, untuk menampilkan tangkapan layar di ASCII di terminal:

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

(Membutuhkan x11-appsuntuk xwd, imagemagickuntuk convertdan jp2a.)

Niklas
sumber
Tidak persis relevan, tetapi penambahan keren.
Yatharth Agarwal
1
xwd -root -display :0 | convert - jpg:- > screenshot.jpg
gregn3
2
Versi ImageMagick modern seringkali tidak dapat menyimpulkan xwdformat dari angka ajaib, jadi lebih baik untuk menentukan format input secara eksplisit: xwd -root -display :0 | convert xwd:- jpg:- | jp2a - --colors
Bass
Bagi saya 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}')
Avio
6

Berikut ini adalah solusi menggunakan xwd, yang tersedia di hampir semua instalasi Xorg:

 xwd -root -out screenshot.xwd

The screenshot.xwdfile dapat dibuka dengan GIMP:

Untuk info lebih lanjut, lihat http://www.x.org/wiki/UserDocumentation/GettingStarted/ .

rendon
sumber
5

Inilah yang bekerja untuk saya.

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

Coba gunakan rana

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

Impor tidak akan berfungsi, karena jendela root tidak digunakan. Mengomposit "bypass" -nya (setiap jendela dirender dalam buffernya sendiri kemudian digandakan ke tampilan, alih-alih dengan cara lama, di mana mereka semua dirender pada jendela "root").

Selain itu Anda harus memastikan VTY aktif sebelum Anda mengambil tangkapan layar. Jadi misalnya,

#!/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
kapas
sumber
Tidak, masih memberikan layar hitam :(
Yatharth Agarwal
Apakah Anda dalam sesi X (pada monitor) ketika Anda melakukan ini. Saya baru saja mencoba dan itu bekerja dengan cukup baik. Anda harus masuk, dan memiliki sesi X di VTY yang aktif.
coteyr
Saya ingin skrip diluncurkan pada tty untuk dapat melakukan ini.
Yatharth Agarwal
Ya, tetapi apakah Anda beralih ke sesi X sebelum mengambil screenshot. X :0 & sleep 50 && sudo chvt 6 && program & sleep 5 && screenshot(perhatikan skrip yang benar-benar palsu).
coteyr
Juga hanya untuk memastikan sedang berbicara hal yang sama yang Anda inginkan VT0 (atau sesuatu) bukan screen shot dari konsol teks. Jadi, Anda menjalankan skrip dari TTY yang mencoba menyaring cuplikan X (VTY). Apakah itu benar?
coteyr
0

Duduk di komputer yang sama dan melakukannya dari terminal virtual yang berbeda dari server X berjalan tidak berfungsi.

Dijelaskan di sana: http://www.karlrunge.com/x11vnc/faq.html#faq-linuxvc . Mengutip:

T-108: Saya menggunakan Linux Virtual Terminal (VT's) untuk mengimplementasikan 'Fast User Switching' di antara sesi pengguna (misalnya Betty pada Ctrl-Alt-F7, Bobby pada Ctrl-Alt-F8, dan Sid pada Ctrl-Alt -F1: mereka menggunakan penekanan tombol tersebut untuk beralih di antara sesi mereka.) Bagaimana pandangan dalam penampil VNC yang menghubungkan ke x11vnc benar-benar hitam, tidak memperbarui, atau piksel kacau kecuali sesi X x11vnc yang terpasang di dalam aktif VT?

Ini tampaknya ada hubungannya dengan bagaimana aplikasi (proses X server dalam kasus ini) harus "bermain dengan baik" jika mereka tidak aktif di VT (kadang-kadang disebut VC untuk konsol virtual.) Artinya, mereka tidak boleh membaca dari keyboard atau mouse atau kelola tampilan video kecuali mereka memiliki VT aktif. Karena tampaknya panggilan XGetImage () pada akhirnya harus mengambil data framebuffer dari perangkat keras video itu sendiri, masuk akal jika polling x11vnc tidak akan berfungsi kecuali sesi X memiliki kontrol aktif VT.

Sepertinya tidak ada cara mudah untuk mengatasi hal ini. Bahkan xwd (1) tidak berfungsi dalam hal ini (coba saja.) Sesuatu harus dilakukan pada level yang lebih rendah, katakanlah di server XFree86 / Xorg X. Selain itu, menggunakan Shadow Framebuffer (salinan framebuffer video disimpan di memori utama) tampaknya tidak memperbaiki masalah (terakhir diperiksa 2007.)

Jika tidak ada yang duduk di workstation dan Anda hanya ingin secara remote mengalihkan VT ke yang terkait dengan sesi X Anda (jadi x11vnc dapat polling dengan benar), seseorang dapat menggunakan perintah chvt (1), misalnya "chvt 7" untuk VT # 7.

Ramblar Golar
sumber