Apakah mungkin untuk mengakses framebuffer untuk menempatkan piksel pada layar dari baris perintah?


15

Saya tidak yakin apakah itu satu-satunya cara yang mungkin, tetapi saya membaca bahwa untuk menempatkan satu piksel ke layar di lokasi pilihan Anda, Anda harus menulis sesuatu ke tempat yang disebut framebuffer. Jadi saya menjadi penasaran, apakah mungkin untuk masuk ke tempat ini dan menulis sesuatu ke dalamnya untuk menampilkan satu piksel di suatu tempat di layar.


Anda tidak menentukan OS mana. Linux?
Gilles 'SANGAT berhenti menjadi jahat'

Ya, Linux (mint codename rebecca)
Abdul Al Hazred

Jawaban:


16

ya, di luar X-server, dalam tty, coba perintah:

cat /dev/urandom >/dev/fb0

jika colourfull piksel mengisi layar, maka pengaturan Anda ok, dan Anda dapat mencoba bermain dengan skrip kecil ini:

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

di mana fungsi 'pixel' harus menjadi jawaban ... tulis piksel ke layar dengan mengubah nilai byte (biru-hijau-merah-alfa) pada offset xy perangkat / dev / fbX yang merupakan buffer bingkai untuk kartu video.

atau coba satu draw pixel liner (kuning pada x: y = 200: 100, jika lebarnya 1024):

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

PEMBARUAN: kode ini berfungsi bahkan di dalam X-server, jika kita hanya mengkonfigurasi X untuk menggunakan frame buffer . dengan menentukan fb0 di dalam /usr/share/X11/xorg.conf.d/99-fbdev.conf


Ada beberapa hal berbahaya yang terjadi di sini: contoh pertama muncul untuk menulis byte acak ke disket, untuk beberapa alasan. Penggunaan perintah tindak lanjut ddyang sering disebut "Penghancuran Disk" untuk alasan tertentu ... jangan dekati perintah ini kecuali Anda tahu apa yang Anda lakukan ...
robert

4
@robert Saya pikir Omar berarti /dev/fbXdan /dev/fditu hanya kesalahan ketik. Dan ya, dditu berbahaya, tetapi juga begitu rm. Itu tidak berarti itu tidak boleh digunakan. Itu hanya berarti bahwa itu harus digunakan dengan hati-hati.
terdon

ah /dev/fb0lebih masuk akal! Semua orang tahu apa rmartinya, tetapi ddsedikit lebih kabur, masih berpikir itu harus membawa peringatan kesehatan.
robert

2
"Ya, di luar X-server, dalam tty, coba perintah:" Saya tidak mengerti jika saya melakukannya dengan benar, jadi saya mencoba membuka terminal dan menulis "cat / dev / urandom> / dev / fd0" tapi saya hanya dapat pesan kesalahan: "cat: kesalahan tulis: tidak ada ruang tersisa di perangkat". Saya benar-benar tidak tahu bagaimana keluar dari xserver.
Abdul Al Hazred

1
... saya menyebutnya tty, tetapi itu adalah konsol virtual, hal non-gui, terminal di atas semua layar, yang Anda jangkau dengan ctrl-alt-f1,2,3 ... atau "sudo chvt 1" ... ' tidak ada ruang yang tersisa 'sepertinya akan baik-baik saja, hanya saja Anda masih dalam sesi-X.
Asain Kujovic

0

Saya baru saja memposting ini pagi ini, masih menyelidiki mengapa itu hanya berfungsi pada Raspberry Pis. https://www.raspberrypi.org/forums/viewtopic.php?f=72&t=213964&p=1428891#p1428891

Buka / dev / fb0, mmap sehingga Anda mendapatkan pointer, dan itu jauh lebih cepat. Tidak menggunakan X sama sekali tetapi itu akan dengan senang hati mengabaikan X, itu hanya sesuatu di layar.

Oh, dari baris perintah, semacam, Anda dapat menulis ke / dev / fb0. Tetapi apa pun yang Anda tulis pada offset 0 akan berada di sudut kiri atas sehingga akan segera menggulir layar. Anda dapat melakukan for for di Bash dan menulis beberapa ribu kali. Atau gunakan / dev / urandom. Menghancurkan apa yang ada di screenbuffer, terutama saat Anda berada di X, bukan masalah besar. Segera setelah Anda menyeret jendela ke area X menyebabkan acara terbuka dan mengecatnya kembali. Anda tidak perlu membunuh kekuatan untuk memulihkan.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.