Чи можливий доступ до фреймбуфера, щоб поставити піксель на екрані з командного рядка?


16

Я не впевнений, чи це єдиний можливий спосіб, але я прочитав, що для того, щоб поставити один піксель на екран у вибраному вами місці, потрібно щось написати в місце, яке називається framebuffer. Тож мені стало цікаво, чи можна зайти в це місце і написати щось у ньому, щоб відобразити один піксель десь на екрані.


Ви не вказали, яка ОС. Linux?
Жил "ТАК - перестань бути злим"

Так, Linux (кодова назва монетного двору rebecca)
Абдул Аль Хазред

Відповіді:


17

так, поза X-сервером, у tty, спробуйте команду:

cat /dev/urandom >/dev/fb0

якщо кольорові пікселі заповнюють екран, то налаштування в порядку, і ви можете спробувати грати з цим невеликим сценарієм:

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

де функція "піксель" повинна бути відповіддю ... запишіть піксель на екран, змінивши значення байтів (синьо-зелений-червоний-альфа) на зміщення xy пристрою / dev / fbX, що є буфером кадрів для відеокарти.

або спробуйте один піксельний малюнок вкладиша (жовтий на x: y = 200: 100, якщо ширина 1024):

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

ОНОВЛЕННЯ: цей код працює навіть усередині X-сервера, якщо ми просто налаштуємо X на використання буфера кадру . вказавши fb0 всередині /usr/share/X11/xorg.conf.d/99-fbdev.conf


Тут відбувається декілька небезпечних речей: перший приклад з’являється, якби чомусь записати випадкові байти на дискету. Наступні команди, ddякі часто називають "Disk Destroy" з певних причин ... не підходьте до цих команд, якщо ви не знаєте, що ви робите ...
robert

4
@robert Я думаю, що Омар мав на увазі, /dev/fbXі це /dev/fdбув просто друкарський помилок . І так, ddнебезпечно, але так і є rm. Це не означає, що його не слід використовувати. Це просто означає, що його слід використовувати обережно.
тердон

ах /dev/fb0має більше сенсу! Усі знають, що rmозначає, але ddдещо незрозуміліше, все ж думають, що це повинно містити попередження про здоров'я.
Роберт

2
"так, поза X-сервером, в tty, спробуйте команду:" Я не розумію, чи правильно я це зробив, тому я спробував просто відкрити термінал і записати "cat / dev / urandom> / dev / fd0", але я отримав лише повідомлення про помилку: "cat: помилка запису: на пристрої не залишилось місця". Я справді не знаю, як вибратися з xserver.
Абдул Аль Хазред

1
... Я назвав це tty, але це віртуальна консоль, не-гуі річ, термінал на всьому екрані, що ви досягаєте за допомогою ctrl-alt-f1,2,3 ... або "sudo chvt 1" ... ' не залишається місця ', здається, це буде добре, просто ви все ще на X-сесії.
Асаїн Куйович

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. Знищити те, що є в екрані екрана, особливо тоді, коли ви перебуваєте в X, - це не велика справа. Як тільки ви перетягнете вікно на область X, це спричинить викриття події та перефарбує його. Вам не потрібно вбивати силу, щоб відновитися.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.