Nous allons maintenant utliser la libraire PIL de python qui permet de traiter les images.
Qu'est ce qu'une librairie
C'est un ensemble de fonctions qu'on peut utiliser, on peut dire une extension de python qui lui rajoute des instructions.
Concrètement on écrit :
import PIL
et on peut dès lors utiliser les fonction de la librairie. Par exemple l'instruction :
img = PIL.Image.open('pomme.jpg')
crée une variable img qui contient les données de l'image.
Cette variable est un objet python qu'on peut manipuler avec des instructions comme :
img.save('nom_du_fichier','JPG')
pour sauvegarder l'image au format JPGOu encore :
img.size
qui nous donnera par exemple (300,500) si l'image fait 300 pixels de larges et 500 pixels de hauteur.Les tuples : un nouveau type de variable
En Python,(300,500)
est appelé un tuple, c'est un type de variable.
Nous pouvons l'utiliser par exemple ainsi :
Nous aurons également besoin de manipuler les valeurs des 3 couleurs rouge, vert et bleu, d'un pixel.
La couleur d'un pixel est un tuple de 3 valeurs, comme par exemple : (120, 30, 200). Ce tuple indique la couleur :
rouge=120 vert=20 bleu=200
Pour récupérer les valeurs des 3 couleurs nous feront comme pour la taille :
Boucles imbriquées
Enfin une dernière chose dont nous allons avoir besoin : une image est un ensemble de pixels de coordonnées (x,y). Pour lire tous les pixels nous allons utiliser 2 boucles imbriquées. Examinons un cas simple, d'une image constituée de 6 pixels dont les couleurs sont indiquées ci-dessous :
(100,10,10) | (200,40,10) | (100,200,100) | |
(10,10,10) | (20,40,60) | (10,200,30) |
si on veux afficher les 2 pixels de coordonnées (0,0) et (0,1) ;
Exercice
Mais si on veux afficher tous les pixels ?
C'est là qu'on va faire 2 boucles imbriquées :
On commence par récuppérer la taille de l'image, avec la fonction image size(). size renvoie la taille en nombre de pixels, largeur x hauteur.
ATTENTION : la largeur est le nombre de colonnes, et la hauteur est le nombre de lignes !
Ensuite on lit tout les pixels, lignes par ligne, et pour chaque ligne toutes les colonnes.
x (numéro de ligne) varie de 0 à 1
pour chaque valeur de x, y (numéro de colonne) varie de 0 à 2
Exercice
Et pour modifier l'image ?
C'est possible, bien entendu. Au lieu de getpixel, qui permet de "lire" la couleur d'un pixel, on va utiliser putpixel, qui permet d'écrire :