Gestion d'images et interface graphique

Commencer par télécharger une image (.bmp de préférence) pas trop volumineuse, comme celle-ci, au meme endroit que votre nouveau fichier Python, qui lui sera nommé image.py.
meilleurs voeux!

Charger une image et l'afficher dans une fenêtre.



######################################
# Importation des modules nécessaires:
######################################


from tkinter import *
import tkinter.messagebox
import tkinter.filedialog
from PIL import Image, ImageTk


####################################
# Creation de la fenetre principale:
####################################


Mafenetre = Tk()                
Mafenetre.title("Image")                                  # Titre de la fenetre



######################################################################
# Creation d'un widget Canvas pour afficher une image dans la fenetre:
######################################################################

Canevas = Canvas(Mafenetre)              


###################################################
# Importation de l'image avec un boite de dialogue:
###################################################


filename = tkinter.filedialog.askopenfilename(title="Ouvrir une image",filetypes=[('jpg files','.jpg'),('bmp files','.bmp'),('all files','.*')]) 


#######################
# Affichage de l'image:
#######################


photo = ImageTk.PhotoImage(file=filename)                  # Nécessaire pour travailler avec différents types d'images

Canevas.config(height=photo.height(),width=photo.width())  # Règle la taille du canvas par rapport à la taille de l'image 
Canevas.create_image(0,0,anchor=NW,image=photo)            # Règle l'emplacement du milieu de l'image, ici dans le coin Nord Ouest (NW) de la fenetre  
Canevas.pack()                                             # Peut se voir comme le "print" pour les objets graphiques 

Mafenetre.mainloop()                                       # Cette ligne devra toujours se située à la fin du programme 
						           # Les commandes suivantes seront donc placées avant celle-ci. 		

Fermer l'image

Manipuler les images...



#################################################################################
# Ouverture de l'image en interne de façon à connaitre les données la concernant:
#################################################################################


image=Image.open(filename)
pix = image.load()
(l,h) = image.size

Fermer l'image

A présent, vous avez la liste pix qui contient les composantes RGB de chaque pixel de l'image.
Taper en ligne de commande: pix[0,0], vous obtiendrez un triplet de nombres entre 0 et 255 correspondant aux trois couleurs Rouge, Vert et Bleu. En l'occurence, ce triplet correspond au premier pixel en haut à gauche de l'image. La première coordonnée pour les colonnes et la deuxième pour les lignes.

Vous avez également les dimensions de l'image. Affichez l et h en ligne de commande.

Avant de le lancer, que va faire le programme suivant?



for x in range(l):
	for y in range(h):
		pix[x,y]=(pix[x,y][0],0,0)

Pour afficher le résultat des changements de pixels dans la fenetre, il faut d'abord sauvegarder l'image sous un certain nom:



image.save('rouge.bmp')

(Vous pouvez aller voir dans votre fichier, la nouvelle image rouge.bmp.)

Cependant, nous allons l'afficher dans notre fenetre:



photorouge=ImageTk.PhotoImage(file='rouge.bmp')
Canevas.config(height=photorouge.height(),width=photorouge.width())
Canevas.create_image(0,0,anchor=NW,image=photorouge)
Canevas.pack()

Exercice 1: En vert
Modifier votre programme pour qu'il affiche la composante Verte de l'image.

Exercice 2: En bleu
Modifier votre programme pour qu'il affiche la composante Bleue de l'image.

Exercice 3: En nuances de gris...
Lorsque les trois couleurs ont la meme valeur, le pixel est gris (voir le site de M.Coeugniet...).
Première idée: Quelle valeur peut-on attribuer à chaque composante? Le faire et le tester.
Deuxieme idée: Rechercher sur internet les proportions de chaque couleur permettant un meilleur rendu en nuances de gris. Modifier alors votre programme.

Rendre la fenetre interactive à l'aide de boutons.

Un bouton déclenche une action lorsque l'on clique dessus. Il faut donc définir au préalable cette action ou autrement dit cette fonction.
Une fonction se déclare comme ceci:


def nomdelafonction(parametres de la fonction):
	commandes indentées à réaliser lors de son appel

Les fonctions apparaissent au début du programme après l'importation des modules

Ainsi copier toutes les commandes permettant de passer en nuances de gris et les placer au début sous ceci:



def gris():

Attention à l'indentation...

Python n'affichera pas l'image tant que celle-ci n'a pas été mise en mémoire dans un dictionnaire par exemple. Il faut alors ajouter avant les définitions de fonctions:


dict={}  
et d'ajouter après l'affectation "photogris=ImageTk.PhotoImage(file='gris.bmp')":

dict[0]=photogris  

Il suffit à présent de placer le bouton appelant cette fonction.
Ajouter à la fin du programme, avant mainloop(), les lignes suivantes, faciles à comprendre...:



bouton=Button(Mafenetre, text="Nuances de gris", command=gris)
bouton.pack()

Exercice:
Placer les boutons Rouge, Vert, Bleu et Nuances de gris permettant de passer l'image choisie en composante rouge, verte, bleue ou Nuances de gris.