Как сделать снимок экрана графического интерфейса пользователя 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}')
Avio
6

Вот решение с использованием xwd, которое доступно почти во всех установках Xorg:

 xwd -root -out screenshot.xwd

screenshot.xwdФайл может быть открыт с помощью GIMP:

Для получения дополнительной информации см. Http://www.x.org/wiki/UserDocumentation/GettingStarted/ .

Rendon
источник
5

Вот что сработало для меня.

chvt 7
DISPLAY=:0 import -window root "$HOME/Pictures/screenshot.png
chvt 1
Яфарт Агарвал
источник
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
coteyr
источник
Нет, все еще даю черный экран :(
Yatharth Agarwal
Вы в сеансе X (на мониторе), когда вы делаете это. Я только попробовал, и это работало довольно хорошо. Вам нужно будет войти в систему и иметь сеанс X в активном VTY.
Coteyr
Я хочу, чтобы скрипт, запущенный в tty, мог это сделать.
Яфарт Агарвал
Да, но переключаетесь ли вы на сеанс X, прежде чем делать снимок экрана. X :0 & sleep 50 && sudo chvt 6 && program & sleep 5 && screenshot(обратите внимание, полностью поддельный сценарий).
coteyr 9.12.12
Также просто чтобы убедиться, что вы говорите то же самое, что и VT0 (или что-то еще), а не снимок экрана текстовой консоли. Итак, вы запускаете сценарий из TTY, пытаясь сделать снимок экрана X (VTY). Это верно?
coteyr 9.12.12
0

Сидеть на одном компьютере и делать это с другого виртуального терминала, на котором работает X-сервер, не работает.

Это объясняется там: http://www.karlrunge.com/x11vnc/faq.html#faq-linuxvc . Quote:

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

Похоже, это связано с тем, что приложения (процессы X-сервера в этом случае) должны «хорошо играть», если они не находятся на активном VT (иногда его называют VC для виртуальной консоли). То есть они не должны читать с клавиатуры. или мышь или управлять дисплеем видео, если у них нет активного VT. Учитывая, что кажется, что вызов XGetImage () должен в конечном итоге получить данные кадрового буфера от самого видеооборудования, было бы разумно, чтобы опрос x11vnc не работал, если сеанс X не имел активного управления VT.

Кажется, нет простого способа обойти это. Даже xwd (1) в этом случае не работает (попробуйте.) Что-то нужно сделать на более низком уровне, скажем, на XFree86 / Xorg X-сервере. Кроме того, использование теневого кадрового буфера (копия кадрового буфера видео хранится в основной памяти), по-видимому, не решает проблему (последняя проверка 2007 г.)

Если никто не сидит за рабочей станцией и вы просто хотите удаленно переключить VT на тот, который связан с вашим сеансом X (чтобы x11vnc мог правильно его опрашивать), можно использовать команду chvt (1), например, «chvt 7» для VT # 7.

Голар Рамблар
источник