เป็นไปได้ที่จะเข้าถึง framebuffer เพื่อวางพิกเซลบนหน้าจอจากบรรทัดคำสั่งหรือไม่


16

ฉันไม่แน่ใจว่ามันเป็นวิธีเดียวที่เป็นไปได้หรือไม่ แต่ฉันอ่านเพื่อที่จะวางพิกเซลเดียวลงบนหน้าจอในตำแหน่งที่คุณเลือกต้องเขียนบางสิ่งในที่ ๆ เรียกว่า framebuffer ดังนั้นฉันจึงอยากรู้อยากเห็นถ้าเป็นไปได้ที่จะเข้ามาในสถานที่นี้และเขียนบางสิ่งบางอย่างลงไปเพื่อแสดงพิกเซลเดียวที่ใดก็ได้บนหน้าจอ


คุณไม่ได้ระบุระบบปฏิบัติการใด ลินุกซ์?
Gilles 'หยุดความชั่วร้าย'

ใช่ลินุกซ์ (มิ้นท์ชื่อรหัส
รีเบคก้า

คำตอบ:


17

ใช่ภายนอก X-server ใน tty ลองคำสั่ง:

cat /dev/urandom >/dev/fb0

หากพิกเซล colourfull เติมเต็มหน้าจอแสดงว่าการตั้งค่าของคุณนั้นโอเคและคุณสามารถลองเล่นกับสคริปต์ขนาดเล็กนี้:

#!/usr/bin/env bash

fbdev=/dev/fb0 ;   width=1280 ; bpp=4
color="\x00\x00\xFF\x00" #red colored

function pixel()
{  xx=$1 ; yy=$2
   printf "$color" | dd bs=$bpp seek=$(($yy * $width + $xx)) \
                        of=$fbdev &>/dev/null
}
x=0 ; y=0 ; clear
for i in {1..500}; do
   pixel $((x++)) $((y++))
done

โดยที่ฟังก์ชัน 'pixel' ควรเป็นคำตอบ ... เขียนพิกเซลไปยังหน้าจอโดยเปลี่ยนค่าไบต์ (blue-green-red-alpha) บน xy offset ของอุปกรณ์ / dev / fbX ซึ่งเป็นบัฟเฟอร์เฟรมสำหรับวิดีโอการ์ด

หรือลองวาดหนึ่งไลเนอร์พิกเซล (สีเหลืองบน x: y = 200: 100 หากความกว้างคือ 1024):

printf "\x00\xFF\xFF\x00" | dd bs=4 seek=$((100 * 1024 + 200)) >/dev/fb0

UPDATE:รหัสนี้ทำงานได้แม้อยู่ภายในเซิร์ฟเวอร์ X, ถ้าเราเพียงแค่กำหนดค่า X ใช้เฟรมบัฟเฟอร์ โดยการระบุ fb0 ภายใน /usr/share/X11/xorg.conf.d/99-fbdev.conf


มีสิ่งอันตรายสองสามอย่างเกิดขึ้นที่นี่ตัวอย่างแรกดูเหมือนจะเขียนไบต์แบบสุ่มไปยังฟลอปปี้ดิสก์ด้วยเหตุผลบางอย่าง การติดตามคำสั่งการใช้งานddที่ได้รับมักจะเรียกว่า "ดิสก์ทำลาย" สำหรับเหตุผลที่เฉพาะเจาะจง ... ไม่ได้ไปอยู่ใกล้กับคำสั่งเหล่านี้ถ้าคุณรู้ว่าสิ่งที่คุณทำ ...
โรเบิร์ต

4
@ โรเบิร์ตฉันคิดว่าโอมาร์หมายถึง/dev/fbXและ/dev/fdเป็นเพียงการพิมพ์ผิด และใช่ddเป็นอันตราย แต่ก็เป็นrmเช่นนั้น ไม่ได้หมายความว่าไม่ควรใช้ หมายความว่าควรใช้ด้วยความระมัดระวัง
terdon

อา/dev/fb0เหมาะสมมากกว่า! ทุกคนรู้ว่าอะไรrmคือความหมาย แต่ddเป็นสิ่งที่คลุมเครือกว่าเล็กน้อยยังคงคิดว่ามันควรจะมีคำเตือนเรื่องสุขภาพ
เบิ

2
"ใช่, นอก X-server, ใน tty, ลองใช้คำสั่ง:" ฉันไม่เข้าใจว่ามันถูกต้องหรือไม่, ดังนั้นฉันจึงลองเปิดเทอร์มินัลและเขียน "cat / dev / urandom> / dev / fd0" แต่ฉันได้รับเท่านั้น ข้อความแสดงข้อผิดพลาด: "cat: write error: ไม่มีที่ว่างบนอุปกรณ์" ฉันไม่รู้วิธีออกจาก xserver จริงๆ
Abdul Al Hazred

1
... ฉันเรียกมันว่า tty แต่มันเป็นเสมือนคอนโซลไม่ใช่สิ่ง gui เทอร์มินัลผ่านหน้าจอทั้งหมดที่คุณเข้าถึงด้วย ctrl-alt-f1,2,3 ... หรือ "sudo chvt 1" ... ' ไม่มีที่ว่างเหลือ 'ดูเหมือนว่ามันจะโอเคแค่คุณยังอยู่ใน X-session
Asain Kujovic

0

ฉันเพิ่งโพสต์เมื่อเช้านี้ยังคงตรวจสอบสาเหตุที่ใช้ได้กับราสเบอร์รี่พิสเท่านั้น https://www.raspberrypi.org/forums/viewtopic.php?f=72&t=213964&p=1428891#p1428891

เปิด / dev / fb0, mmap เพื่อให้คุณได้ตัวชี้และมันเร็วกว่ามาก ไม่ใช้ X เลย แต่มันจะไม่สนใจ X แต่เป็นเพียงบางอย่างบนหน้าจอ

โอ้จากบรรทัดคำสั่งคุณสามารถเขียนถึง / dev / fb0 แต่สิ่งที่คุณเขียนที่ออฟเซ็ต 0 จะอยู่ที่มุมซ้ายบนดังนั้นมันจะเลื่อนออกจากหน้าจอทันที คุณสามารถทำลูปใน Bash และเขียนสองสามพันครั้ง หรือใช้ / dev / urandom การทำลายสิ่งที่อยู่ใน screenbuffer โดยเฉพาะในขณะที่คุณอยู่ใน X นั้นไม่ใช่เรื่องใหญ่อะไร ทันทีที่คุณลากหน้าต่างบนพื้นที่ X ทำให้เกิดเหตุการณ์ที่เปิดเผยและวาดใหม่ คุณไม่จำเป็นต้องฆ่ากำลังเพื่อกู้คืน

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