Tutoriel n°2 : PyGame et Numpy : Afficher un tableau Numpy à l'écran
L'objectif de ce tutoriel est de montrer comment afficher un tableau de pixel a l'écran. Ce concept peut être utile lors de l'utilisation d'OpenCL pour le calcule d'image. En PyOpenCL on utilise des tableau Numpy.array pour transmettre des informations entre le GPU et le CPU. On récupére donc le résultat dans un tableau Numpy.array. Nous allons donc ici nous contenté d'afficher dans une fenêtre une surface de pixel aléatoire à partir d'un tableau numpy.
import pygame import numpy
1 - Créer une fenêtre PyGame
La création d'une fenêtre avec PyGame se fait très facilement. Il suffit de connaitre la taille de la fenêtre que l'on souhaite. Ici 640 pixels de largeur et 480 pixels de hauteur avec 32 bits par pixel.
screen = pygame.display.set_mode((640, 480))
2 - Numpy pour généré un tableau de bruit
Ici on crée un tableau remplit de valeur aléatoire. Il faut ensuite les
A = numpy.random.rand(640,480) A = A255255*255 A = A.astype(numpy.uint32)
On peut bien évidament lorsque l'on a compris le principe l'écrire en une seul ligne si l'on préfére
A = (numpy.random.rand(640,480)255255*255).astype(numpy.uint32)
3 - Afficher le tableau de valeur en tant qu'image
Le transfert de l'image ce fait en 2 temps:
- Créer un tableau-surface (pygame.surfarray)
- Affichage de l'image à l'écran
La première étape se fait a l'initialisation et la seconde à chaque image.
bits = pygame.surfarray.pixels2d(pygame.Surface((640,480))) pygame.surfarray.blit_array(screen,bits)
Conclusion
Encore une fois on constate que l'utilisation de python et des modules PyGame et Numpy simplifie grandement les efforts de développement. Voici le code pour afficher une fenêtre de bruit aléatoire, un peut comme une télévision sans antenne.
import pygame
import numpy
import random
screen = pygame.display.set_mode((640, 480))
running = 1
bits = pygame.surfarray.pixels2d(pygame.Surface((640,480)))
while running:
event = pygame.event.poll()
if event.type == pygame.QUIT:
running = 0
A = (numpy.random.rand(640,480)255255*255).astype(numpy.uint32)
bits[:] = A[:]
pygame.surfarray.blit_array(screen,bits)
pygame.display.flip()