2. Gestion des images dans Tkinter

Tkinter comprend par défaut des fonctions de gestion d'image, mais qui se limitent aux seuls formats GIF et PGM/PPM de type brut ( et pas ASCII ).
Pour la manipulation d'autres formats, il faut utiliser le module PIL ( Python Image Library ) après l'avoir importé. ( Ce module n'est pas installé de base avec Python, il faut généralement le rajouter par la suite )

2.1. Ouverture d'une image

Principe

L'intégration d'une image suit le schéma suivant :

Travail à faire :

Écrire un script qui affiche une image GIF ou PGM/PPM dans une fenêtre Tkinter.

2.2. Manipulation des pixels

Lecture de la valeur d'un pixel :

	pixel = mon_image.get(x,y)
			

Deux choses très importantes à avoir à l'esprit :

  1. les coordonnées du pixel sont données en indiquant d'abord son abscisse, puis son ordonnée; c'est l'inverse du mode opératoire utilisé avec les listes de listes, où l'on donne d'abord le numéro de ligne ( = y ) puis celui de la colonne ( = x )...Le point (0,0), origine des coordonnées, est le coin haut-gauche de l'image.

  2. Attention, l'information renvoyée ( ici stockée dans la variable pixel ) est en fait constituée d'un "bloc" de 3 valeurs, codant chacune le Rouge, le Vert et le Bleu. Un tel bloc s'appelle en Python un tuple.
    Un tuple est défini en Python par des parenthèses ( ici : (r, v , b) ), et les éléments d'un tuple ne sont pas modifiables.
    L'index de chaque élément est précisé de manière analogue à celui utilisé avec les listes.

	pixel = mon_image.get(56,23)
	print(pixel)
	>>> ( 122 , 235 , 46)
	
	print(pixel[1])
	>>> 235			
				

Modification de la valeur d'un pixel :

Les informations devant être formatées d'une manière particulière, on utilisera la syntaxe suivante sans se poser trop de questions :

	photo.put("#%02x%02x%02x" % pixel, (x,y))
			

pixel doit être un tuple de 3 valeurs cohérentes avec le codage des couleurs de l'image ( pour une image en niveaux de gris, ces 3 valeurs doivent donc être identiques...)
Même remarque que ci-dessus pour le système de coordonnées (x,y) utilisé.

2.3. Une interface pour le traitement d'images

Vous allez maintenant "recoller" les bouts de scripts que vous avez écrits jusqu'à maintenant, dans l'objectif de réaliser une interface pour les fonctions de traitement d'images que vous avez écrites précédemment.

L'interface pourrait se présenter de la façon suivante :

Les boutons appelleront les différentes fonctions de traitement de l'image; vous pourrez en rajouter bien entendu, mais commencez d'abord à en faire fonctionner un !!

Pour définir la valeur du seuil, on utilise ici une échelle de valeurs, correspondant au widget Scale. Vous pouvez expérimenter d'autres possibilités, le widget SpinBox pourrait aussi convenir...

Pensez également à améliorer un peu le positionnement des différents widgets.