Як зробити скріншот GUI на основі X11 з текстового терміналу (наприклад, tty1)?


11

Я спробував використовувати DISPLAY=:0 import -window root "$HOME/Pictures/screenshot.png"( importє частиною набору ImageMagick), але це просто відображає чорний екран.

Я хочу зробити це так, як я хотів автоматизувати відкриття програми та робити знімки екрана на різних мовах, а для зміни мов мені потрібно перезапустити lightdm. отже, запустіть на tty, щоб ваш сценарій продовжував працювати ...

Відповіді:


10

На додаток до існуючих відповідей, щоб відобразити скріншот у ASCII в терміналі:

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

(Потрібно x11-appsдля xwd, imagemagickдля convertта jp2a.)


Не зовсім актуальне, але класне доповнення.
Ятхарт Агарвал

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

2
Сучасні версії ImageMagick часто не можуть встановити xwdформат із магічних чисел, тому краще чітко вказати формат введення: xwd -root -display :0 | convert xwd:- jpg:- | jp2a - --colors
Bass

Для мене: xwd -name "$win_name" | convert xwd:- /tmp/"$win_name".pngдеwin_name=$(xwininfo -tree -root | grep 'The Window Name Im Looking For' | awk -F\" '{print $2}')
Авіо



5

Спробуйте використовувати затвор

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

Імпорт не буде працювати, оскільки кореневе вікно не використовується. Композиція "обходить" її (кожне вікно надається у власному буфері, а потім мультиплексоване на дисплей замість старого способу, де вони були відображені у вікні "корінь").

Крім того, вам потрібно переконатися, що VTY активний, перш ніж зробити знімок екрана. Так, наприклад,

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

Ні, все ж даючи чорний екран :(
Ятхарт Агарвал

Ви перебуваєте на X сесії (на моніторі), коли це робите. Я просто спробував, і це спрацювало непогано. Вам потрібно буде увійти в систему та провести X сеанс в активному VTY.
coteyr

Я хочу, щоб сценарій, запущений в tty, міг це зробити.
Ятхарт Агарвал

Так, але чи переходите ви на X-сеанс, перш ніж знімати екран. X :0 & sleep 50 && sudo chvt 6 && program & sleep 5 && screenshot(зауважте повністю підроблений сценарій).
coteyr

Крім того, щоб переконатися, що говорили те саме, що ви хочете, щоб VT0 (або щось таке), а не знімок екрана текстової консолі. Отже ваш запущений сценарій із TTY, який намагається зняти екран X (VTY). Це правильно?
coteyr

0

Сидіти на одному комп’ютері та робити це з іншого віртуального терміналу, ніж працює X-сервер, не працює.

Це пояснюється там: http://www.karlrunge.com/x11vnc/faq.html#faq-linuxvc . Цитата:

Q-108: Я використовую віртуальні термінали Linux (VT) для впровадження «Швидкого переключення користувачів» між сеансами користувачів (наприклад, Бетті знаходиться на Ctrl-Alt-F7, Боббі - на Ctrl-Alt-F8, а Sid - на Ctrl-Alt -F1: вони використовують ці натискання клавіш для перемикання між сеансами.) Яким чином перегляд у переглядачі VNC, який підключається до x11vnc, або повністю чорний, не оновлюється, або пікселі змішуються, якщо в сеансі X не встановлено x11vnc активний VT?

Це, мабуть, пов'язане з тим, як програми (X-сервер в цьому випадку) повинні "грати добре", якщо вони не є на активному VT (іноді його називають VC для віртуальної консолі). Тобто вони не повинні читати з клавіатури або мишкою або керуйте дисплеєм відео, якщо у них немає активної VT. Зважаючи на те, що, як видається, виклик XGetImage () повинен у кінцевому рахунку отримати дані фреймбуферів із самого відео апаратного забезпечення, було б сенсом опитування x11vnc не працюватиме, якщо X сеанс не мав активного управління VT.

Здається, це не простий спосіб подолати це. Навіть xwd (1) не працює в цьому випадку (спробуйте.) Щось потрібно зробити на нижчому рівні, скажімо на сервері XFree86 / Xorg X. Крім того, використання Shadow Framebuffer (копія відеокадрівника зберігається в основній пам'яті) не вирішує проблему (востаннє перевірено 2007 р.)

Якщо на робочій станції ніхто не сидить, і ви просто хочете віддалено переключити VT на той, що пов’язаний з вашим X-сеансом (щоб x11vnc міг правильно опитувати його), можна скористатися командою chvt (1), наприклад "chvt 7" для VT №7.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.