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.
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()
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()