-->

Tutoriel n°2 : PyGame et Numpy : Afficher un tableau Numpy à l'écran


By Stéphane Planquart - Posted on 04 janvier 2010

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()