photo librairie PIL

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 JPG
Ou 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 :
Exemple

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 :

Exemple

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

Exemple

Exercice

Exercice de code : utiliser getpixel
Comme dans l'exemple précédent, on a défini une image de 6 pixels (légèrement différente de la première) avec encore 2 lignes et 3 colonnes
Ajoute une ligne de code pour afficher la couleur du pixel situé en bas à droite de l'image.

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

Exemple

Exercice

Exercice de code : lire toute l'image
Tel quel, ce code ne fonctionnera pas. En effet nous avons modifié l'image qui ne fait plus 2 pixels de large et 3 pixels de haut.
Dans le code, on utilise img.size() qui permet de connaitre la largeur l et la hauteur h (en nombre de pixels) de l'image. Il faut utiliser l et h dans la boucle pour pouvoir afficher tous les pixels....

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 :

Exemple