Czy można uzyskać dostęp do bufora ramki, aby umieścić piksel na ekranie z wiersza poleceń?

16

Nie jestem pewien, czy jest to jedyny możliwy sposób, ale przeczytałem, że aby umieścić pojedynczy piksel na ekranie w wybranym miejscu, należy napisać coś w miejscu zwanym buforem ramek. Byłem więc ciekawy, czy można wejść w to miejsce i napisać w nim coś, aby wyświetlić gdzieś na ekranie pojedynczy piksel.

Abdul Al Hazred
źródło
Nie określiłeś, który system operacyjny. Linux?
Gilles „SO- przestań być zły”
Tak, Linux (nazwa kodowa rebecca)
Abdul Al Hazred
stackoverflow.com/questions/4996777/…
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件

Odpowiedzi:

17

tak, poza X-serwerem, w tty, spróbuj polecenia:

cat /dev/urandom >/dev/fb0

jeśli kolorowe piksele wypełnią ekran, oznacza to, że Twoja konfiguracja jest w porządku i możesz spróbować grać za pomocą tego małego skryptu:

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

gdzie funkcja „piksel” powinna być odpowiedzią ... zapisz piksel na ekranie, zmieniając wartości bajtów (niebiesko-zielono-czerwono-alfa) na przesunięciu xy urządzenia / dev / fbX, który jest buforem ramki dla karty graficznej.

lub spróbuj narysować jeden piksel liniowy (żółty na x: y = 200: 100, jeśli szerokość wynosi 1024):

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

AKTUALIZACJA: ten kod działa nawet wewnątrz X-serwera, jeśli tylko skonfigurujemy X do używania bufora ramki . poprzez określenie fb0 wewnątrz /usr/share/X11/xorg.conf.d/99-fbdev.conf

Asain Kujovic
źródło
Dzieje się tu kilka niebezpiecznych rzeczy: z jakiegoś powodu pierwszy przykład wydaje się zapisywać losowe bajty na dyskietce. Kolejne polecenia, ddktóre często nazywane są „Disk Destroy” z określonych powodów ... nie zbliżaj się do tych poleceń, chyba że wiesz, co robisz…
Robert
4
@robert Myślę, że Omar miał na myśli /dev/fbXi to /dev/fdbyła tylko literówka. I tak, ddjest niebezpieczne, ale takie też jest rm. To nie znaczy, że nie należy go używać. Oznacza to po prostu, że należy go używać ostrożnie.
terdon
ah /dev/fb0ma większy sens! Wszyscy wiedzą, co to rmznaczy, ale ddsą nieco bardziej niejasne, nadal uważają, że powinno zawierać ostrzeżenie zdrowotne.
Robert
2
„tak, poza X-serwerem, w tty, spróbuj polecenia:„ Nie rozumiem, czy mam rację, więc próbowałem po prostu otworzyć terminal i napisać „cat / dev / urandom> / dev / fd0”, ale dostałem tylko komunikat o błędzie: „cat: błąd zapisu: brak miejsca na urządzeniu”. Naprawdę nie wiem, jak wyjść z Xservera.
Abdul Al Hazred
1
... nazwałem to tty, ale jest to wirtualna konsola, nie-gui, terminal na całym ekranie, do którego docierasz za pomocą ctrl-alt-f1,2,3 ... lub „sudo chvt 1” ... ” wydaje się, że nie ma już wolnego miejsca, po prostu nadal jesteś w sesji X.
Asain Kujovic
0

Właśnie opublikowałem dziś rano, wciąż badając, dlaczego działa tylko na Raspberry Pis. https://www.raspberrypi.org/forums/viewtopic.php?f=72&t=213964&p=1428891#p1428891

Otwórz / dev / fb0, mmap go, aby uzyskać wskaźnik, i jest znacznie szybszy. W ogóle nie używa X, ale na szczęście zignoruje X, to po prostu coś na ekranie.

Och, z wiersza poleceń możesz napisać do / dev / fb0. Ale cokolwiek napiszesz z przesunięciem 0, będzie w lewym górnym rogu, więc natychmiast przewinie ekran. Możesz zrobić pętlę for w Bash i napisać kilka tysięcy razy. Lub użyj / dev / urandom. Zniszczenie zawartości bufora ekranu, szczególnie gdy jesteś w X, nie jest niczym wielkim. Natychmiast po przeciągnięciu okna nad obszarem X powoduje zdarzenie odsłonięcia i odmalowuje je. Nie musisz zabijać mocy, aby się zregenerować.

Alan Corey
źródło