วิธีจับภาพหน้าจอของ 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.)


ไม่เกี่ยวข้องอย่างแน่นอน แต่เป็นการเติมที่ยอดเยี่ยม
Yatharth Agarwal

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

7

นี่คือการแก้ปัญหาโดยใช้xwdซึ่งมีอยู่ในการติดตั้ง Xorg เกือบทั้งหมด:

 xwd -root -out screenshot.xwd

screenshot.xwdไฟล์สามารถเปิดได้กับคนพิการ:

สำหรับข้อมูลเพิ่มเติมโปรดดูที่http://www.x.org/wiki/UserDocumentation/GettingStarted/



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

Nope ยังคงให้หน้าจอสีดำ :(
Yatharth Agarwal

คุณอยู่ในเซสชัน X (บนจอภาพ) หรือไม่เมื่อคุณทำเช่นนี้ ฉันลองแล้วมันใช้งานได้ค่อนข้างดี คุณจะต้องเข้าสู่ระบบและมีเซสชัน X ใน VTY ที่ใช้งานอยู่
coteyr

ฉันต้องการสคริปต์ที่เปิดตัวใน tty เพื่อให้สามารถทำสิ่งนี้ได้
Yatharth Agarwal

ใช่ แต่คุณเปลี่ยนเป็นเซสชัน 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 Virtual Terminals (VT) เพื่อใช้ 'การสลับผู้ใช้อย่างรวดเร็ว' ระหว่างเซสชันของผู้ใช้ (เช่น Betty อยู่บน Ctrl-Alt-F7, Bobby อยู่ที่ Ctrl-Alt-F8 และ Sid อยู่ใน Ctrl-Alt -F1: พวกเขาใช้การกดแป้นพิมพ์เหล่านั้นเพื่อสลับระหว่างเซสชันของพวกเขา) ทำไมมุมมองใน VNC วิวเวอร์ที่เชื่อมต่อกับ x11vnc มีสีดำสนิทไม่อัปเดตหรือพิกเซลเลอะเลือนเว้นแต่เซสชั่น X X11vnc เชื่อมต่ออยู่ใน ใช้งาน VT?

ดูเหมือนว่าจะเกี่ยวข้องกับแอปพลิเคชัน (กระบวนการเซิร์ฟเวอร์ X ในกรณีนี้) ต้อง "เล่นอย่างดี" หากไม่ได้อยู่ใน VT ที่ใช้งานอยู่ (บางครั้งเรียกว่า VC สำหรับคอนโซลเสมือน) นั่นคือพวกเขาไม่ควรอ่านจากแป้นพิมพ์ หรือเมาส์หรือจัดการการแสดงผลวิดีโอเว้นแต่ว่าพวกเขาจะมี VT ที่ใช้งานอยู่ เนื่องจากปรากฏว่าการเรียก XGetImage () จะต้องดึงข้อมูล framebuffer จากฮาร์ดแวร์วิดีโอในท้ายที่สุดมันจะทำให้การโพลของ x11vnc ไม่สามารถทำงานได้เว้นแต่ว่าเซสชัน X จะมีการควบคุม VT อย่างแข็งขัน

ดูเหมือนจะไม่มีวิธีง่ายๆในการแก้ไขปัญหานี้ แม้แต่ xwd (1) ก็ไม่สามารถใช้งานได้ในกรณีนี้ (ลองใช้งาน) สิ่งที่ต้องทำในระดับที่ต่ำกว่ากล่าวในเซิร์ฟเวอร์ XFree86 / Xorg X นอกจากนี้การใช้ Shadow Framebuffer (สำเนาของ framebuffer วิดีโอจะถูกเก็บไว้ในหน่วยความจำหลัก) ไม่ปรากฏขึ้นเพื่อแก้ไขปัญหา (ตรวจสอบล่าสุด 2007)

หากไม่มีใครนั่งอยู่ที่เวิร์กสเตชันและคุณต้องการสลับ VT จากระยะไกลไปเป็น VT ที่เกี่ยวข้องกับเซสชัน X ของคุณ (เพื่อให้ x11vnc สำรวจความคิดเห็นได้อย่างถูกต้อง) คุณสามารถใช้คำสั่ง chvt (1) เช่น "chvt 7" สำหรับ VT # 7

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.