Malen Sie die Pixel auf dem Bildschirm über Linux FrameBuffer
Ich war vor kurzem aufgefallen, eine kuriose Idee, um die Eingabe von /dev/urandom, konvertieren relevante Zeichen, die zufällige Ganzzahlen und verwenden Sie diesen Integer-zahlen, wie die rgb/x-y-Werte für die Pixel, um die Farbe auf den Bildschirm.
Ich habe einige der Forschung getan (hier auf StackOverflow und anderswo) und viele vermuten, dass Sie können schreiben Sie einfach an /dev/fb0 direkt, wie es ist die Datei, die die Darstellung des Geräts. Leider scheint dies nicht zu keinem optisch sichtbarem Ergebnis.
Fand ich ein Beispiel-C-Programm, das vom QT-tutorial (nicht mehr erhältlich), mit einer mmap zum schreiben in den Puffer. Wird das Programm erfolgreich ausgeführt, aber wieder, keine Ausgabe auf dem Bildschirm. Interessanterweise, wenn ich legte meine laptop in den Ruhezustand und später wiederhergestellt, sah ich einen momentanen Blitz der das Bild (rotes Quadrat), die geschrieben wurde, um den framebuffer viel früher. Hat das schreiben in den framebuffer mehr in Linux für die Malerei zu Bild? Im Idealfall würde ich gerne schreiben (ba)sh-script, aber C oder ähnlich funktionieren würde, wie gut. Danke!
EDIT: Hier das sample-Programm...kann vertraut Tierärzte.
#include <stdlib.h>
#include <unistd.h>
#include <stdio.h>
#include <fcntl.h>
#include <linux/fb.h>
#include <sys/mman.h>
#include <sys/ioctl.h>
int main()
{
int fbfd = 0;
struct fb_var_screeninfo vinfo;
struct fb_fix_screeninfo finfo;
long int screensize = 0;
char *fbp = 0;
int x = 0, y = 0;
long int location = 0;
//Open the file for reading and writing
fbfd = open("/dev/fb0", O_RDWR);
if (fbfd == -1) {
perror("Error: cannot open framebuffer device");
exit(1);
}
printf("The framebuffer device was opened successfully.\n");
//Get fixed screen information
if (ioctl(fbfd, FBIOGET_FSCREENINFO, &finfo) == -1) {
perror("Error reading fixed information");
exit(2);
}
//Get variable screen information
if (ioctl(fbfd, FBIOGET_VSCREENINFO, &vinfo) == -1) {
perror("Error reading variable information");
exit(3);
}
printf("%dx%d, %dbpp\n", vinfo.xres, vinfo.yres, vinfo.bits_per_pixel);
//Figure out the size of the screen in bytes
screensize = vinfo.xres * vinfo.yres * vinfo.bits_per_pixel / 8;
//Map the device to memory
fbp = (char *)mmap(0, screensize, PROT_READ | PROT_WRITE, MAP_SHARED, fbfd, 0);
if ((int)fbp == -1) {
perror("Error: failed to map framebuffer device to memory");
exit(4);
}
printf("The framebuffer device was mapped to memory successfully.\n");
x = 100; y = 100; //Where we are going to put the pixel
//Figure out where in memory to put the pixel
for (y = 100; y < 300; y++)
for (x = 100; x < 300; x++) {
location = (x+vinfo.xoffset) * (vinfo.bits_per_pixel/8) +
(y+vinfo.yoffset) * finfo.line_length;
if (vinfo.bits_per_pixel == 32) {
*(fbp + location) = 100; //Some blue
*(fbp + location + 1) = 15+(x-100)/2; //A little green
*(fbp + location + 2) = 200-(y-100)/5; //A lot of red
*(fbp + location + 3) = 0; //No transparency
//location += 4;
} else { //assume 16bpp
int b = 10;
int g = (x-100)/6; //A little green
int r = 31-(y-100)/16; //A lot of red
unsigned short int t = r<<11 | g << 5 | b;
*((unsigned short int*)(fbp + location)) = t;
}
}
munmap(fbp, screensize);
close(fbfd);
return 0;
}
InformationsquelleAutor der Frage Richard Martinez | 2011-02-14
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn Sie mit X11, MÜSSEN Sie gehen durch X11-APIs zum zeichnen auf dem Bildschirm. Geht um den X-server ist sehr unübersichtlich (und oft wie Sie gesehen haben, funktioniert nicht). Es kann auch zum Absturz führen, oder einfach nur die Allgemeine Anzeige der Korruption.
Wenn Sie wollen in der Lage sein, überall laufen (sowohl Konsole & unter X), Blick auf SDL oder GGI. Wenn Sie nur über X11, die Sie verwenden können, GTK, QT oder sogar Xlib. Es gibt viele, viele Optionen...
InformationsquelleAutor der Antwort derobert
Hatte ich Erfolg mit den folgenden paar Experimente.
Erstens, herauszufinden, ob X mit TrueColor-RGB-padded to 32 bit (oder einfach annehmen, dass dies der Fall ist). Dann finden Sie heraus, wenn Sie haben die Berechtigung schreiben fb0 (und, dass es existiert). Wenn diese wahr sind (und ich erwarte, dass viele moderne toolkits/desktops/PCs können verwenden Sie diese als Standardwerte), dann sollten Sie in der Lage sein, Folgendes zu tun (und wenn Sie diesen Standard nicht halten, dann kann man wohl noch einige Erfolge mit den folgenden tests durch, obwohl die details variieren):
Test 1: öffnen Sie ein virtuelles terminal (in X) und geben Sie in:
$ echo "ddd ... ddd" >/dev/fb0
wo ... ist eigentlich ein paar Bildschirm-erfüllt von d.... Das Ergebnis wird in einem oder mehreren (Teil -) Linien von Grau über der Oberseite des Bildschirms, je nachdem, wie lange ist dein echo-string und was pixel Auflösung, die Sie aktiviert haben. Sie können auch wählen Sie einen Buchstaben (ascii-Werte sind alle kleiner als 0x80, so dass die entstehende Farbe wird ein dunkles Grau.. und variieren Sie die Briefe, wenn Sie wollen etwas anderes außer Grau). Offensichtlich, dies kann verallgemeinert werden, um eine shell-Schleife, oder Sie können die Katze eine große Datei, um zu sehen, der Effekt deutlicher: eg:
$ cat /lib/libc.so.6 >/dev/fb0
um zu sehen, die wahren Farben der einige fsf-Unterstützer ;-P
Keine Sorge, wenn ein großer Teil des Bildschirms wird über geschrieben. X hat immer noch Kontrolle über den Mauszeiger und noch eine Idee, wo windows zugeordnet sind. Alles, was Sie tun müssen, ist, greifen in jedem Fenster, und ziehen Sie Sie um ein bit zu löschen, die Lärm.
Test 2: cat /dev/fb0 > xxx
dann ändern Sie das Aussehen von Ihrem desktop (z.B. neue Fenster öffnen und schließen andere).
Schließlich tun das Gegenteil: cat xxx > /dev/fb0, um Ihre alten desktop zurück!
Ha, naja, nicht ganz. Das Bild von Ihrem alten desktop ist eine illusion, und Sie werden schnell verzichten, wenn Sie öffnen Sie ein beliebiges Fenster auf Vollbildgröße.
Test 3: Schreiben Sie ein kleines app, packt einen vor-dump von /dev/fb0 und ändert die Farben der Pixel, z.B. nach entfernen der rot-Komponente oder vermehren die Blaue, oder drehen Sie die rote und die grüne, etc. Dann schreiben Sie wieder diese Pixel in eine neue Datei, die Sie betrachten können später über einfache shell-Ansatz für die Prüfung 2. Beachten Sie auch, dass Sie wahrscheinlich Umgang mit B-G-R-A 4-byte-Mengen pro pixel. Dies bedeutet, dass Sie wollen, ignorieren alle 4 byte und behandeln auch die erste in jedem Satz, als die blau-Komponente. "ARGB" ist big-endian, so dass, wenn Sie besuchen diese bytes durch die zunehmende index ein C-array, blau würde zuerst kommen, dann grün, dann rot.. ie, B-G-R-A (nicht A-R-G-B).
Test 4: schreiben Sie ein Programm in einer beliebigen Sprache, die Schleife bei der video-Geschwindigkeit, die senden ein nicht quadratisches Bild (denke xeyes) auf einem Teil des Bildschirms, so wie Sie eine animation erstellen, ohne windows Grenzen. Für extra-Punkte, die Animationen bewegen sich alle über den Bildschirm. Sie haben, um sicherzustellen, dass das überspringen einen großen Raum zeichnen Sie eine kleine Zeile Wert der Pixel (make-up für die Bildschirm Breite, wahrscheinlich ist viel breiter als das Bild animiert wird).
Test 5: spielen Sie einen trick auf einen Freund, zB, erweitern, test 4, so dass ein Bild eine animierte person, die angezeigt wird, um pop-up auf Ihrem desktop (vielleicht film selbst, um die pixel-Daten), geht dann über zu einer Ihrer wichtigsten desktop-Ordner, nimmt den folder und zerreißt Sie auseinander, dann beginnt lachen hysterisch, und dann einen Feuerball kam heraus und verschlingen den gesamten desktop. Obwohl dies alles eine illusion sein, können Sie ausflippen, ein bisschen.. aber benutzen Sie es als eine Lernerfahrung zu zeigen, Linux und open-source-und zeigen, wie es ist viel unheimlicher, schauen, um ein Anfänger, als es tatsächlich ist. [der "virus" sind in der Regel harmlos Illusionen auf Linux]
InformationsquelleAutor der Antwort Jose_X
Ich würde sagen, vorsichtig sein, bevor Sie versuchen, schreiben auf /dev/fb0, wie oben vorgeschlagen. Ich habe versucht, es unter X
in ubuntu 10.04 und a) nichts passiert ist, optisch, b) es zerstört alle shell-windows, auch andere ttys, was zu kernel-Fehlern und mangelnder Funktionalität.
InformationsquelleAutor der Antwort David
Sollten Sie verwenden fb_fix_screeninfo.smem_len für Bildschirmgröße zu tun, anstatt die Multiplikation selbst. Der Puffer könnte ausgerichtet sein auf 4 bytes oder etwas anderes.
InformationsquelleAutor der Antwort Alex Arsenault
Wenn ich dieses Programm zu schreiben Vollbildmodus abgestürzt war, ist aufgrund der Display-Größe Berechnung ist falsch.
Soll das sein:
InformationsquelleAutor der Antwort Nataraja KM
wenn Sie das Programm Debuggen, finden Sie die Zeile:
screensize
0 ist. da vinfo.xres 0 ist.ändern Sie es zu:
InformationsquelleAutor der Antwort Hsiang Chen