Можно ли получить доступ к кадровому буферу, чтобы поместить пиксель на экран из командной строки?

16

Я не уверен, что это единственный возможный способ, но я прочитал, что для того, чтобы поместить один пиксель на экран в выбранном вами месте, нужно что-то записать в место, называемое framebuffer. Поэтому мне стало любопытно, можно ли войти в это место и записать в него что-нибудь, чтобы отобразить один пиксель где-нибудь на экране.

Абдул Аль Хазред
источник
Вы не указали, какая ОС. Linux?
Жиль "ТАК - перестать быть злым"
Да, Linux (кодовое имя монетного двора Ребекка)
Абдул Аль Хазред
stackoverflow.com/questions/4996777/…
Сиро Сантилли 新疆 改造 中心 法轮功 六四 事件

Ответы:

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

где функция 'pixel' должна быть ответом ... записать пиксель на экран, изменив байтовые значения (синий-зеленый-красный-альфа) по смещению 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которые по определенным причинам часто называются «Уничтожение диска» ... не подходите к этим командам, если не знаете, что делаете ...
Роберт
4
@ Роберт Я думаю, Омар имел в виду, /dev/fbXи это /dev/fdбыла просто опечатка. И да, ddэто опасно, но это так rm. Это не значит, что его не следует использовать. Это просто означает, что его следует использовать с осторожностью.
Terdon
ах /dev/fb0имеет больше смысла! Все знают, что rmозначает, но ddнемного более неясны, все еще думают, что это должно нести предупреждение здоровья.
Роберт
2
«Да, вне X-сервера, в tty, попробуйте команду:« Я не понимаю, правильно ли я понял, поэтому я попытался просто открыть терминал и написать «cat / dev / urandom> / dev / fd0», но я только получил сообщение об ошибке: «cat: write error: на устройстве не осталось места». Я действительно не знаю, как выйти из 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, отобразите его так, чтобы вы получили указатель, и это намного быстрее. X вообще не использует X, но с радостью проигнорирует X, это просто что-то на экране.

О, из командной строки вы можете написать в / dev / fb0. Но все, что вы пишете со смещением 0, будет в левом верхнем углу, поэтому оно сразу же прокрутится с экрана. Вы можете сделать цикл for в Bash и написать пару тысяч раз. Или используйте / dev / urandom. Уничтожить то, что находится в буфере экрана, особенно когда вы находитесь в X, это не проблема. Как только вы перетаскиваете окно над областью X, вызывает событие expose и перерисовывает его. Вам не нужно убивать власть, чтобы восстановиться.

Алан Кори
источник