Bien qu'il soit possible de transformer géométriquement une image en utilisant une technique similaire à celle présentée dans la manipulation des canaux, Pygame possède une fonctionnalité très performante permettant de manipuler des tableaux de pixels : PixelArray. Cette fonctionnalité permet ainsi d'accéder directement à tous les pixels d'une surface.
Dans le cas d'un tableau de pixels à deux dimensions : l'indexation d'un élément du tableau se fait de manière classique en précisant sa colonne et sa ligne [column,row].
Chaque élément du tableau de pixels peut se présenter sous la forme d'un entier ou d'un tuple de forme (r, g, b[, a]) où r , g , b désignent respectivement la valeur des canaux RVB et a la valeur du canal alpha.
Effets Miroirs
Un grand classique est le retournement d'une image, par exemple l'effet miroir (vertical) : le haut et le bas de l'image sont inversés si bien que l'image est vue la tête en bas.
Voici le code réalisant l'opération :
import pygame
from pygame.locals import *
# Initialisation de la fenêtre d'affichage
pygame.init()
fenetre = pygame.display.set_mode((870,522))
pygame.display.set_caption("La Vie de Marc Chagall")
# Traitement de l'image
fond = pygame.image.load("lavie.jpg").convert()
# Création du tableau de pixels et inversion
pxarray = pygame.PixelArray(fond)
sf = pxarray[:,::-1].make_surface()
#collage du fond
fenetre.blit(sf,(0,0))
pygame.display.flip()
# Boucle principale
continuer = 1
while continuer:
for event in pygame.event.get():
# Quitter
if event.type == QUIT:
continuer = 0
pygame.quit()
La code est très efficace : l'image est modifiée puis chargée très rapidement grâce à la technique de surface wrapping.
A noter ici :
pygame.PixelArray(fond)
pxarray[:,::-1]
. L'expression ":" dans l'emplacement réservé à la colonne a pour conséquence une lecture standard de la valeur de la colonne alors que l'expression"::-1" a pour conséquence une lecture à rebours de la valeur de la ligne c'est à dire une inversion du sens de lecture des lignes en commençant par la finmake_surface()
Exemple d'exercice d'appropriation : créer un deuxième script permettant cette fois-ci de créer un effet miroir horizontal c'est à dire d'inverser la gauche et la droite de l'image.
La correction du script est ici.
Voici le résultat des deux effets miroirs sur notre image de départ :
Rotations
Un autre grand classique est la rotation de l'image de 90° dans le sens horaire ou anti-horaire. Il faut, lors du processus, récupérer les nouvelles dimensions de l'image et changer toutes les coordonnées des pixels de l'image : la transposition du tableau de pixels va permettre de réaliser rapidement cette deuxième opération.
Voici le code réalisant la rotation de l'image de 90° dans le sens horaire :
import pygame
from pygame.locals import *
# Initialisation de la fenêtre d'affichage
pygame.init()
fenetre = pygame.display.set_mode((180,300))
pygame.display.set_caption("La Vie de Marc Chagall")
# Traitement de l'image
fond = pygame.image.load("lavie_reduite.jpg").convert()
w, h = fond.get_size ()
surface2 = pygame.Surface ((h, w), fond.get_flags (), fond)
pxarray = pygame.PixelArray (fond)
pxarray2 = pygame.PixelArray (surface2)
pxarray2[...] = pxarray.transpose ()[::-1,:]
sf = pxarray2.make_surface()
#collage du fond
fenetre.blit(sf,(0,0))
pygame.display.flip()
# Boucle principale
continuer = 1
while continuer:
for event in pygame.event.get():
# Quitter
if event.type == QUIT:
continuer = 0
pygame.quit()
Détaillons un peu les opérations effectuées par ce code :
fond.get_size ()
permet de récupérer la largeur et la hauteur de l'objet "fond" c'est à dire de notre imagepygame.Surface ((h, w), fond.get_flags (), fond)
. La méthode get_flags ()
apparaissant dans l'instruction permet de récupérer l'attribut de la méthode d'affichage (surface stockée dans la mémoire système, surface stockée dans la mémoire vidéo, utilisation d'une palette de couleurs spécifiques, activation de l'accélération graphique, etc...) et de l'appliquer à la nouvelle surface créée.pygame.PixelArray (fond)
et pygame.PixelArray (surface2)
xarray.transpose ()[::-1,:]
Exemple d'exercice d'appropriation : créer un deuxième script permettant cette fois-ci de faire tourner l'image de 90° dans le sens antihoraire.
La correction du script est ici.
Voici le résultat des deux rotations sur l'image de départ (redimensionnée au format 300x180) :