Code Recipes←
Below are a few code recipes for pygame, Pillow, Pycairo, and plain NumPy to get you started. If you're unsure how to install this library, check out the installation section.
pygame Example←
First install pygame,
Then run this program,
from random import randint
import pygame
from dispmanx import DispmanX
def random_color_with_alpha():
return tuple(randint(0, 0xFF) for _ in range(3)) + (randint(0x44, 0xFF),)
display = DispmanX(pixel_format="RGBA")
surface = pygame.image.frombuffer(display.buffer, display.size, display.pixel_format)
clock = pygame.time.Clock()
for _ in range(20):
surface.fill(random_color_with_alpha())
display.update()
clock.tick(2)
Pillow Example←
NumPy Required
For this example to work correctly, ensure you've installed
NumPy. The easiest way to do that with pip is:
pip install dispmanx[numpy]
First install Pillow,
Then run this program,
import time
from random import randint
import numpy
from PIL import Image, ImageDraw
from dispmanx import DispmanX
def random_color_with_alpha():
return tuple(randint(0, 0xFF) for _ in range(3)) + (randint(0x44, 0xFF),)
display = DispmanX(pixel_format="RGBA", buffer_type="numpy")
image = Image.new(mode=display.pixel_format, size=display.size)
draw = ImageDraw.Draw(image)
for _ in range(20):
draw.rectangle(((0, 0), (image.size)), fill=random_color_with_alpha())
numpy.copyto(display.buffer, image)
display.update()
time.sleep(0.5)
A Note About Performance
This example includes copying an RGBA array of pixels from a Pillow rendering, rather than editing an array in-place like the other examples. This is inherently slow, so you're not going to get as high frame rates as in the pygame example.
If you know a way to do in-place modification of numpy arrays with Pillow, let me know by filing a GitHub issue!
Pycairo Example←
First install Pycairo,
Then run this program,
from random import uniform
import time
from cairo import ImageSurface, FORMAT_RGB24, Context
from dispmanx import DispmanX
def random_color():
return tuple(uniform(0, 1) for _ in range(3))
display = DispmanX(pixel_format="RGBX")
width, height = display.size
surface = ImageSurface.create_for_data(display.buffer, FORMAT_RGB24, width, height)
context = Context(surface)
for _ in range(20):
context.set_source_rgba(*random_color())
context.rectangle(0, 0, display.width - 1, display.height - 1)
context.fill()
display.update()
time.sleep(0.5)
NumPy Example←
All you need is NumPy for this one. First, install it,
Then run this program to create a fake static effect,
import time
import numpy
from dispmanx import DispmanX
import numpy
display = DispmanX(pixel_format="RGB565", buffer_type="numpy")
high = numpy.iinfo(display.buffer.dtype).max + 1 # white pixel
rng = numpy.random.default_rng()
while True:
static = rng.integers(low=0, high=high, size=display.buffer.shape, dtype=display.buffer.dtype)
numpy.copyto(display.buffer, static) # Simulates TV static
display.update()
time.sleep(0.0135)
What's Next?←
Now that you're an expert, check out the API documentation.