GNU/Linux >> Tutoriales Linux >  >> Linux

Pintar píxeles en la pantalla a través de Linux FrameBuffer

He tenido éxito con los siguientes experimentos.

Primero, averigüe si X está usando TrueColor RGB acolchado a 32 bits (o simplemente suponga que este es el caso). Luego averigüe si tiene permiso de escritura en fb0 (y si existe). Si esto es cierto (y espero que muchos juegos de herramientas/computadoras de escritorio/PC modernos puedan usarlos como valores predeterminados), entonces debería poder hacer lo siguiente (y si estos valores predeterminados no se cumplen, probablemente aún pueda tener algo de éxito con las siguientes pruebas, aunque los detalles pueden variar):

Prueba 1:abra una terminal virtual (en X) y escriba:$ echo "ddd ... ddd">/dev/fb0 donde ... es en realidad unas cuantas pantallas llenas de d. El resultado será una o más líneas (parciales) de gris en la parte superior de la pantalla, según la longitud de la cadena de eco y la resolución de píxeles que haya habilitado. También puede elegir cualquier letra (los valores ascii son todos inferiores a 0x80, por lo que el color producido será un gris oscuro... y varíe las letras si desea algo además del gris). Obviamente, esto se puede generalizar a un bucle de shell o puede catear un archivo grande para ver el efecto más claramente:por ejemplo:$ cat /lib/libc.so.6>/dev/fb0 para ver los verdaderos colores de algunos fsf seguidores;-P

No se preocupe si se sobrescribe una gran parte de la pantalla. X todavía tiene el control del puntero del mouse y todavía tiene su idea de dónde se asignan las ventanas. Todo lo que tienes que hacer es agarrar cualquier ventana y arrastrarla un poco para borrar el ruido.

Prueba 2:cat /dev/fb0> xxxluego cambie la apariencia de su escritorio (por ejemplo, abra nuevas ventanas y cierre otras). Finalmente, haga lo contrario:cat xxx> /dev/fb0 para recuperar su antiguo escritorio!

Ja, bueno, no del todo. La imagen de tu antiguo escritorio es una ilusión, y rápidamente prescindirás de ella cuando abras cualquier ventana a pantalla completa.

Prueba 3:escriba una pequeña aplicación que tome un volcado anterior de /dev/fb0 y modifique los colores de los píxeles, por ejemplo, para eliminar el componente rojo o aumentar el azul, o voltear el rojo y el verde, etc. Luego escriba estos píxeles en un nuevo archivo que puede ver más tarde a través del enfoque de shell simple de la prueba 2. Además, tenga en cuenta que probablemente tendrá que lidiar con cantidades de B-G-R-A de 4 bytes por píxel. Esto significa que desea ignorar cada cuarto byte y también tratar el primero de cada conjunto como el componente azul. "ARGB" es big-endian, por lo que si visita estos bytes a través del índice creciente de una matriz C, el azul vendría primero, luego el verde, luego el rojo... es decir, B-G-R-A (no A-R-G-B).

Prueba 4:escriba una aplicación en cualquier idioma que se reproduzca en bucle a la velocidad del video enviando una imagen no cuadrada (piense en xeyes) a una parte de la pantalla para crear una animación sin bordes de ventanas. Para obtener puntos extra, haga que la animación se mueva por toda la pantalla. Deberá asegurarse de omitir un espacio grande después de dibujar una pequeña fila de píxeles (para compensar el ancho de la pantalla que probablemente sea mucho más ancho que la imagen que se está animando).

Prueba 5:juegue una broma a un amigo, por ejemplo, extienda la prueba 4 para que aparezca una imagen de una persona animada en su escritorio (tal vez filme usted mismo para obtener los datos de píxeles), luego camine hacia uno de sus escritorios importantes carpetas, toma la carpeta y la destroza, luego comienza a reírse histéricamente, y luego sale una bola de fuego y envuelve todo su escritorio. Aunque todo esto será una ilusión, es posible que se asusten un poco... pero utilícelo como una experiencia de aprendizaje para mostrar Linux y el código abierto y mostrar cómo es mucho más aterrador para un novato de lo que realmente es. [los "virus" son generalmente ilusiones inofensivas en Linux]


Estoy pensando en escribir un programa basado en framebuffer, solo porque necesito poder desplazarme (cascada SDR). Consulte https://www.raspberrypi.org/forums/viewtopic.php?f=28&t=232493&p=1425567#p1425567 La prueba de desplazamiento que considero exitosa. En esas 2 estructuras que buscamos por ioctl para obtener información, también hay cosas sobre la profundidad del color. Parece que has basado tu programa en el mismo ejemplo que yo hice. Cómo obtener el color de píxel de framebuffer en linux (Raspberry Pi)

El mío funciona bien en mi Raspberry Pi, ya sea con X o no. No tiene ningún efecto en la pantalla de mi portátil. Eso tiene un /dev/fb0, el programa se ejecuta y los números se ven bien, pero no hace nada visualmente. Tal vez tenga doble búfer o algo así.

Bajo X, en realidad no hace ningún daño. Si arrastra algunas ventanas para que las cosas se vuelvan a dibujar, todo vuelve. Entonces decidí hacer una copia de seguridad de lo que está en la pantalla y volver a colocarlo cuando terminé, eso también funciona. Una ventana que moví y volví a colocar funciona igual que si nunca la hubiera tocado. X no se da cuenta de que me he metido con el búfer de la pantalla, sabe lo que puso allí y registra los clics del mouse en consecuencia. Si movía una ventana y no la volvía a colocar, los clics seguirían funcionando donde estaban.


Diría que tenga cuidado antes de intentar escribir en /dev/fb0, como se sugirió anteriormente. Lo probé en Xin ubuntu 10.04 y a) no sucedió nada visualmente, b) destruyó todas las ventanas de shell, incluso otros ttys, lo que provocó errores en el kernel y falta de funcionalidad.


Si está ejecutando X11, DEBE pasar por las API de X11 para dibujar en la pantalla. Dar la vuelta al servidor X está muy roto (y, a menudo, como has visto, no funciona). También puede causar fallas o simplemente daños generales en la pantalla.

Si desea poder ejecutarse en todas partes (tanto en la consola como en X), consulte SDL o GGI. Si solo te importa X11, puedes usar GTK, QT o incluso Xlib. Hay muchas, muchas opciones...


Linux
  1. Linux:¿es posible acceder al Framebuffer para poner un píxel en la pantalla desde la línea de comandos?

  2. ¿Cómo detener un proceso de pantalla en Linux?

  3. Eliminar pantalla adjunta en Linux

  4. Fondo de pantalla múltiple en Linux?

  5. Listado de puertos SATA no utilizados en Linux

Cómo conectarse a través de Bluetooth en GNOME en Linux

Cómo ampliar las áreas de la pantalla en el escritorio de Linux

Cómo iniciar automáticamente la sesión de pantalla en Linux al iniciar sesión

Comando de pantalla en Linux explicado

Linux:¿pixelización de la pantalla de Kde?

Cómo SSH al servidor a través de Linux