Ist es möglich, auf den Framebuffer zuzugreifen, um von der Befehlszeile aus ein Pixel auf dem Bildschirm anzuzeigen?

15

Ich bin mir nicht sicher, ob dies der einzig mögliche Weg ist, aber ich habe gelesen, dass man, um ein einzelnes Pixel an einem Ort Ihrer Wahl auf den Bildschirm zu bringen, etwas in einen Ort namens Framebuffer schreiben muss. So wurde ich neugierig, ob es möglich ist, an diesen Ort zu gelangen und etwas hinein zu schreiben, um irgendwo auf dem Bildschirm ein einzelnes Pixel anzuzeigen.

Abdul Al Hazred
quelle
Sie haben nicht angegeben, welches Betriebssystem. Linux?
Gilles 'SO - hör auf böse zu sein'
Ja, Linux (Codename Mint Rebecca)
Abdul Al Hazred

Antworten:

15

Ja, außerhalb von X-Server, in tty, versuche den Befehl:

cat /dev/urandom >/dev/fb0

Wenn der Bildschirm mit farbigen Pixeln gefüllt ist, ist Ihr Setup in Ordnung, und Sie können versuchen, mit diesem kleinen Skript zu spielen:

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

Dabei sollte die Funktion 'Pixel' eine Antwort sein. Schreiben Sie ein Pixel auf den Bildschirm, indem Sie die Bytewerte (blau-grün-rot-alpha) auf den xy-Versatz von device / dev / fbX ändern, der der Bildspeicher für die Grafikkarte ist.

Oder versuchen Sie es mit einem Liner Pixel Draw (gelb auf x: y = 200: 100, wenn die Breite 1024 ist):

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

UPDATE: Dieser Code funktioniert sogar innerhalb von X-Server, wenn X nur für die Verwendung von Frame Buffer konfiguriert wird . indem Sie fb0 in /usr/share/X11/xorg.conf.d/99-fbdev.conf angeben

Asain Kujovic
quelle
Hier passieren einige gefährliche Dinge: Das erste Beispiel scheint aus irgendeinem Grund zufällige Bytes auf eine Diskette zu schreiben. Die Follow-up-Befehle verwenden, dddie aus bestimmten Gründen oft als "Disk Destroy" bezeichnet wurden ... nähern Sie sich diesen Befehlen nur, wenn Sie wissen, was Sie tun ...
robert
4
@robert Ich denke Omar meinte /dev/fbXund das /dev/fdwar nur ein Tippfehler. Und ja, ddist gefährlich, aber so ist es auch rm. Das heißt nicht, dass es nicht verwendet werden sollte. Es bedeutet nur, dass es mit Vorsicht angewendet werden sollte.
Terdon
ah /dev/fb0macht mehr Sinn! Jeder weiß, was es rmbedeutet, aber es ddist etwas unklarer. Trotzdem sollte es eine Gesundheitswarnung enthalten.
Robert
2
"yes, outside X-server, in tty, try command:" Ich verstehe nicht, ob ich es richtig gemacht habe, also habe ich versucht, nur das Terminal zu öffnen und "cat / dev / urandom> / dev / fd0" zu schreiben, aber ich habe nur bekommen eine Fehlermeldung: "cat: write error: no space left on device". Ich weiß wirklich nicht, wie ich aus dem xserver herauskomme.
Abdul Al Hazred
1
... ich nannte es tty, aber es ist eine virtuelle Konsole, ein Nicht-GUI-Ding, ein Terminal über den gesamten Bildschirm, das Sie mit Strg-Alt-F1,2,3 erreichen ... oder "sudo chvt 1" ... ' Kein Platz mehr 'scheint in Ordnung zu sein, nur du bist noch in der X-Session.
Asain Kujovic
0

Ich habe gerade heute Morgen gepostet und untersuche immer noch, warum es nur bei Raspberry Pis funktioniert. https://www.raspberrypi.org/forums/viewtopic.php?f=72&t=213964&p=1428891#p1428891

Öffnen Sie / dev / fb0, ordnen Sie es so zu, dass Sie einen Zeiger erhalten, und es ist viel schneller. Verwendet X überhaupt nicht, ignoriert es jedoch glücklich X, es ist nur etwas auf dem Bildschirm.

Oh, von einer Kommandozeile aus können Sie in / dev / fb0 schreiben. Was auch immer Sie bei Offset 0 schreiben, es befindet sich in der oberen linken Ecke und wird sofort vom Bildschirm gescrollt. Sie könnten eine for-Schleife in Bash machen und ein paar tausend Mal schreiben. Oder benutze / dev / urandom. Es ist keine große Sache, das zu zerstören, was sich im Bildschirmpuffer befindet, besonders wenn Sie sich in X befinden. Sobald Sie ein Fenster über den Bereich X ziehen, wird ein Expose-Ereignis ausgelöst und es wird neu gezeichnet. Sie müssen nicht die Kraft töten, um sich zu erholen.

Alan Corey
quelle