Commit de0494e7 authored by Abdessamad Akabli's avatar Abdessamad Akabli

- Ajout de commentaires permettant une meilleure compréhension du code

- Suppression de la fonction save2() car inutile
- Suppression des Frames car ils apportent rien au programme
parent ab80188f
...@@ -5,101 +5,135 @@ Created on Fri Nov 24 21:48:54 2017 ...@@ -5,101 +5,135 @@ Created on Fri Nov 24 21:48:54 2017
@author: abdessamad et Killian @author: abdessamad et Killian
""" """
from PIL import Image,ImageTk from PIL import Image,ImageTk
"""La bibliothèque Python Imaging Library (PIL) nous permet
de manière facile d'effectuerdiverses traitements sur des images
grâce à des fonctions ultérieurement codées"""
import os import os
"""Ce module est utile car il nous permet d'effacer la console"""
import tkinter as tk import tkinter as tk
"""La bibliothèque tkinter est une sorte de boite à outils
qui nous permet de créer des interfaces graphiques"""
# Variables globales
image_modele = None #Cette variable nous sert pour stocker le chemin qui nous permet d'accéder à l'image
chemin_image = None chemin_image = None
#Cette variable Nous permet de stocker l'objet image initiale à partir de laquelle on va pouvoir faire
image = None image = None
quitter = 0 # Cette variable permet de stocker une copie de l'objet image initialement chargée. On effectuera pas de modifications sur cette copie
revenir_menu_principal = 0 image_modele = None
# Cette variable nous permet de stocker l'image une image compatible avec python
photo = None photo = None
# une variable qui va stocker la fonction qui nous mets de créer des fenêtres des tkinters
root = None root = None
# Variable qui va stocker les images modifiées nous permettons ainsi de pouvoir
image_modifie = None image_modifie = None
#Fonction qui va chercher l'image et l'ouvrir ( Avec chemin d'accès absolu ou relatif )
def ouvrir_image(): def ouvrir_image():
def essai(): """
try: - Fonction qui va chercher l'image et l'ouvrir ( Avec chemin d'accès absolu ou relatif )
"""
def ouvrir_image_traitement():
try: # On test ce morceau de code et en cas d'erreur [except]
global chemin_image global chemin_image
global image global image
global image_modele global image_modele
# On récupère l'entrée de l'utilisateur (Chemin vers l'image)
chemin_image = entree_chemin.get() chemin_image = entree_chemin.get()
print(chemin_image) print(chemin_image)
# On ouvre l'image
image = Image.open(chemin_image) image = Image.open(chemin_image)
# On copie l'image initiale et on la stock dans cette variable
image_modele = image.copy() image_modele = image.copy()
montrer_image(image) # Afficher l'image # Afficher l'image
except FileNotFoundError: montrer_image(image)
#On exécute le code présent dans le except
except FileNotFoundError:
#On utilise la classe Label qui prend plusieurs paramètres (parent,option)
w = tk.Label(root, text="Le chemin est incorrect") w = tk.Label(root, text="Le chemin est incorrect")
#La méthode pack permet de positionner un objet dans une fenêtre ou dans un cadre
w.pack() w.pack()
global chemin_image global chemin_image
# On crée une fenêtre
root = tk.Tk() root = tk.Tk()
# On demande à l'utilisateur de saisir le chemin vers l'image
lbl = tk.Label(root, text="Entrez le chemin") lbl = tk.Label(root, text="Entrez le chemin")
lbl.pack() lbl.pack()
entree_chemin = tk.Entry(root) entree_chemin = tk.Entry(root)
entree_chemin.pack() entree_chemin.pack()
V = tk.Button(root, text="Valider",fg = "green", command = essai) #Btn pour délencher la fonction ouvrir_image()
V = tk.Button(root, text="Valider",fg = "green", command = ouvrir_image_traitement)
V.pack(side=tk.LEFT) V.pack(side=tk.LEFT)
D = tk.Button(root, text="Quitter",fg = "red", command = root.destroy) #Btn pour quitter
D = tk.Button(root, text="Quitter",fg = "red", command = root.destroy)
D.pack(side=tk.RIGHT) D.pack(side=tk.RIGHT)
#Fonction qui va afficher l'image
def afficher_image(): def afficher_image():
global image_modele """Fonction qui va permettre d'afficher l'image initiale autant de fois que l'on veut"""
if image_modele == None: global image_modele
if image_modele == None:
fen = tk.Tk() fen = tk.Tk()
fen.title("Traitement de l'image") fen.title("Traitement de l'image")
tk.Label(fen, text="Un problème est survenu, nous ne pouvons pas ouvrir cette image !").pack() tk.Label(fen, text="Un problème est survenu, nous ne pouvons pas ouvrir cette image !").pack()
else: else:
global image
image_modele.show() image_modele.show()
def montrer_image(image): def montrer_image(image):
#Fonction qui affiche les images dans la fenêtre Tkinter """Fonction qui affiche les images dans la fenêtre ouverte par l'outil Tkinter"""
photo = ImageTk.PhotoImage(image) ## Création d'une image compatible Tkinter photo = ImageTk.PhotoImage(image) # Création d'une image compatible Tkinter
label = tk.Label(image = photo) ## Insertion de l'image label = tk.Label(image = photo) # Insertion de l'image dans un label
label.image = photo label.image = photo #Maintenir l'image l'image en vie
label.pack() label.pack()
#Fonction qui va afficher les informations concernant l'image (mode colorimétrique, format de l'image, dimensions)
def afficher_infos_image(): def afficher_infos_image():
"""Fonction qui va afficher les informations concernant l'image (mode colorimétrique, format de l'image, dimensions)"""
global chemin_image global chemin_image
taille_image = *image.size, # "* = Tous" (On a deux paramètres : Largeur x Hauteur)
varA = *image.size,
root = tk.Tk() root = tk.Tk()
root.title("Traitement de l'image") root.title("Traitement de l'image")
tk.Label(root, text="Propriétés de l'image : " + str(chemin_image)).pack() tk.Label(root, text="Propriétés de l'image : " + str(chemin_image)).pack()
tk.Label(root, text=" Mode colorimétrique :" + str(image.mode)).pack() tk.Label(root, text=" Mode colorimétrique :" + str(image.mode)).pack()
tk.Label(root, text=" Format de l'image :" + (image.format)).pack() tk.Label(root, text=" Format de l'image :" + (image.format)).pack()
tk.Label(root, text=" Dimensions : " + str(varA)).pack() tk.Label(root, text=" Dimensions : " + str(taille_image)).pack()
tk.Button(root, text="Retour",fg = "red", command = root.destroy).pack() tk.Button(root, text="Retour",fg = "red", command = root.destroy).pack()
#Fonction qui va inverser la couleur pour chaque pixel ( Boucles ? // Créer la fonction et ne pas se baser sur celles déjà existante ) #Fonction qui va inverser la couleur pour chaque pixel
def negatif_couleur(): def negatif_couleur():
global image_modifie global image_modifie
image_negatif = image_modele.copy() #On souhaite effectuer les modification sur l'image modèle et non sur des images déjà modifiées
(largeur, hauteur)= image.size image_negatif = image_modele.copy()
# On récupère la taille dans une liste
(largeur, hauteur) = image.size
for x in range(largeur): for x in range(largeur):
for y in range(hauteur): for y in range(hauteur):
#On récupère les pixels présents dans la ligne X et colonne Y, pour chaque pixel on lis son 3-tuple
(rouge,vert,bleu) = image_negatif.getpixel((x,y)) (rouge,vert,bleu) = image_negatif.getpixel((x,y))
# On applique l'effet négatif
(rouge,vert,bleu) = (255-rouge,255-vert,255-bleu) (rouge,vert,bleu) = (255-rouge,255-vert,255-bleu)
image_negatif.putpixel((x,y),(rouge,vert,bleu)) #On crée le pixel finale
image_negatif.putpixel((x,y),(rouge,vert,bleu))
image_negatif.show() image_negatif.show()
image_modifie = image_negatif.copy() #Nécéssaire pour la sauvegarde
image_modifie = image_negatif.copy()
#Fonction qui va faire pivoter l'ensemble de l'image (RGB->RBG // RGB->BGR // RGB->GBR // RBG->GRB)
def rotation_couleurs(): def rotation_couleurs():
"""Fonction qui va faire pivoter l'ensemble de l'image (RGB->RBG // RGB->BGR // RGB->GBR // RBG->GRB)"""
global image_modele global image_modele
(largeur, hauteur)= image.size #On récupère la taille dans une liste
(largeur, hauteur)= image.size
def rgb(): def rgb():
global image_modifie global image_modifie
image_modele.show() image_modele.show()
...@@ -107,10 +141,15 @@ def rotation_couleurs(): ...@@ -107,10 +141,15 @@ def rotation_couleurs():
def bgr(): def bgr():
global image_modifie global image_modifie
image_bgr = image_modele.copy() image_bgr = image_modele.copy()
for x in range(largeur): #Parcourir la largeur de l'image #Parcourir la largeur de l'image
for y in range(hauteur):#Parcourir la longueur de l'image for x in range(largeur):
(rouge,vert,bleu) = image_bgr.getpixel((x,y)) #Récupérer les pixels (x,y) et les stocker dans une liste #Parcourir la longueur de l'image
for y in range(hauteur):
#Récupérer les pixels (x,y) et les stocker dans une liste
(rouge,vert,bleu) = image_bgr.getpixel((x,y))
#On effectue la rotation des couleurs (change la position de chaque pixel)
(rouge,vert,bleu) = (bleu,vert,rouge) (rouge,vert,bleu) = (bleu,vert,rouge)
#On crée le pixel final
image_bgr.putpixel((x,y),(rouge,vert,bleu)) image_bgr.putpixel((x,y),(rouge,vert,bleu))
image_bgr.show() image_bgr.show()
image_modifie = image_bgr.copy() image_modifie = image_bgr.copy()
...@@ -144,21 +183,25 @@ def rotation_couleurs(): ...@@ -144,21 +183,25 @@ def rotation_couleurs():
tk.Button(root, text=" - GBR - Rotation RGB->GBR", command = gbr).pack() tk.Button(root, text=" - GBR - Rotation RGB->GBR", command = gbr).pack()
tk.Button(root, text="Retour",fg = "red", command = root.destroy).pack() tk.Button(root, text="Retour",fg = "red", command = root.destroy).pack()
#Fonction qui va faire pivoter l'ensemble de l'image (-90°,90° et 180° et choix)
def rotation_image(): def rotation_image():
"""Fonction qui va faire pivoter l'ensemble de l'image (-90°,90° et 180° et choix)"""
global image global image
image_modifie = image_modele.copy() image_modifie = image_modele.copy()
def plus90(): def plus90():
image = image_modele.copy() image = image_modele.copy()
global image_modifie global image_modifie
angle = 90 angle = 90
image_modifie = image.rotate(angle, Image.BICUBIC, True) #ça permet de faire un filtrage Bicubique et une adatptation de l'image
image_modifie = image.rotate(angle, Image.BICUBIC, True)
image_modifie.show() image_modifie.show()
#on stock dans une variable la fonction qui va nous permettre de créer une fenêtre avec Tkinter
fen = tk.Tk() fen = tk.Tk()
#On affiche le titre
fen.title("Traitement de l'image") fen.title("Traitement de l'image")
tk.Label(fen, text="Voulez vous sauvegarder cette image ?").pack() tk.Label(fen, text="Voulez vous sauvegarder cette image ?").pack()
tk.Button(fen, text="Oui", command = save2).pack() tk.Button(fen, text="Oui", command = save).pack()
def moins90(): def moins90():
image = image_modele.copy() image = image_modele.copy()
...@@ -169,7 +212,7 @@ def rotation_image(): ...@@ -169,7 +212,7 @@ def rotation_image():
fen = tk.Tk() fen = tk.Tk()
fen.title("Traitement de l'image") fen.title("Traitement de l'image")
tk.Label(fen, text="Voulez vous sauvegarder cette image ?").pack() tk.Label(fen, text="Voulez vous sauvegarder cette image ?").pack()
tk.Button(fen, text="Oui",fg="blue", command = save2).pack() tk.Button(fen, text="Oui",fg="blue", command = save).pack()
def plus180(): def plus180():
...@@ -181,12 +224,12 @@ def rotation_image(): ...@@ -181,12 +224,12 @@ def rotation_image():
fen = tk.Tk() fen = tk.Tk()
fen.title("Traitement de l'image") fen.title("Traitement de l'image")
tk.Label(fen, text="Voulez vous sauvegarder cette image ?").pack() tk.Label(fen, text="Voulez vous sauvegarder cette image ?").pack()
tk.Button(fen, text="Oui",fg="blue", command = save2).pack() tk.Button(fen, text="Oui",fg="blue", command = save).pack()
def angle_choix(): def angle_choix():
image = image_modele.copy() image = image_modele.copy()
def test(): def angle_choix_traitement():
global image_modifie global image_modifie
global image global image
global angle_image global angle_image
...@@ -198,13 +241,13 @@ def rotation_image(): ...@@ -198,13 +241,13 @@ def rotation_image():
global angle_image global angle_image
global image_modifie global image_modifie
fen2 = tk.Tk() fen_angle_choix = tk.Tk()
fen2.title("Traitement de l'image") fen_angle_choix.title("Traitement de l'image")
tk.Label(fen2, text="Donnez l'angle").pack() tk.Label(fen_angle_choix, text="Donnez l'angle").pack()
angle_image = tk.Entry(fen2) angle_image = tk.Entry(fen_angle_choix)
angle_image.pack() angle_image.pack()
tk.Button(fen2, text="Valider",fg = "green", command = test).pack() tk.Button(fen_angle_choix, text="Valider",fg = "green", command = angle_choix_traitement).pack()
fen2.mainloop() fen_angle_choix.mainloop()
root = tk.Tk() root = tk.Tk()
...@@ -223,12 +266,14 @@ def rotation_image(): ...@@ -223,12 +266,14 @@ def rotation_image():
root.mainloop() root.mainloop()
#Fonction qui permet de définir la direction de rotation physique (Gauche, droite, retourner b )
def symetrie_image(): def symetrie_image():
"""Fonction qui permet de définir la direction de rotation physique (Gauche, droite, retourner b )"""
global image global image
def symetrieV(): def symetrieV():
global image_modifie global image_modifie
image = image_modele.copy() image = image_modele.copy()
# On utilise une fonction qui permet de faire la symétrie Verticale
SymetrieV = image.transpose(Image.FLIP_LEFT_RIGHT) SymetrieV = image.transpose(Image.FLIP_LEFT_RIGHT)
SymetrieV.show() SymetrieV.show()
image_modifie = SymetrieV.copy() image_modifie = SymetrieV.copy()
...@@ -236,42 +281,26 @@ def symetrie_image(): ...@@ -236,42 +281,26 @@ def symetrie_image():
def symetrieH(): def symetrieH():
global image_modifie global image_modifie
image = image_modele.copy() image = image_modele.copy()
# On utilise une fonction qui permet de faire la symétrie Horizontale
SymetrieH = image.transpose(Image.FLIP_TOP_BOTTOM) SymetrieH = image.transpose(Image.FLIP_TOP_BOTTOM)
SymetrieH.show() SymetrieH.show()
image_modifie = SymetrieH.copy() image_modifie = SymetrieH.copy()
root = tk.Tk() root = tk.Tk()
tk.Label(root, text="Selon quel axe voulez-vous effectuer la symétrie ?").pack() tk.Label(root, text="Selon quel axe voulez-vous effectuer la symétrie ?").pack()
frame=tk.Frame(root)
frame.pack()
root.title("Symétrie image") root.title("Symétrie image")
tk.Button(frame, text="Symétrie verticale (ou symétrique d'axe horizontal", command = symetrieH).pack() tk.Button(root, text="Symétrie verticale (ou symétrique d'axe horizontal", command = symetrieH).pack()
tk.Button(frame, text="Symétrie Horizontale (ou symétrique d'axe vertical", command = symetrieV).pack() tk.Button(root, text="Symétrie Horizontale (ou symétrique d'axe vertical", command = symetrieV).pack()
tk.Button(frame, text="Retour",fg = "red", command = root.destroy).pack() tk.Button(root, text="Retour",fg = "red", command = root.destroy).pack()
root.mainloop() root.mainloop()
#Fonction qui nettoie l'écran ( supprimer tout élements présent sur l'écran = détruire )
def save2():
def sauvegarde():
nom_image = input_utilisateur.get()
image_save.save(nom_image) #problème
tk.Label(fen, text="Votre sauvegarde s'est effectuée avec succès !", fg = "green").pack()
tk.Button(fen, text="Quitter", fg = "red", command = fen.destroy).pack()
global image_modifie
image_save = image_modifie.copy()
fen = tk.Tk()
fen.title("Traitement de l'image")
label = tk.Label(fen, text="Entrez le nom du fichier")
label.pack()
input_utilisateur = tk.Entry(fen)
input_utilisateur.pack()
bouton_valider= tk.Button(fen, text="Valider",fg = "green", command = sauvegarde)
bouton_valider.pack()
def save(): def save():
"""Fonction permet de sauvegarder les images """
def sauvegarde(): def sauvegarde():
#On récupère l'entrée de l'utilisateur, ici le nom de l'image
nom_image = input_utilisateur.get() nom_image = input_utilisateur.get()
image_save.save(nom_image) #problème #On sauvegarde l'image grâce à la fonction save
image_save.save(nom_image)
#On affiche un message de succès de l'opération et propose à l'utilisateur de quitter la fenêtre
tk.Label(fen, text="Votre sauvegarde s'est effectuée avec succès !", fg = "green").pack() tk.Label(fen, text="Votre sauvegarde s'est effectuée avec succès !", fg = "green").pack()
tk.Button(fen, text="Quitter", fg = "red", command = fen.destroy).pack() tk.Button(fen, text="Quitter", fg = "red", command = fen.destroy).pack()
global image global image
...@@ -286,26 +315,25 @@ def save(): ...@@ -286,26 +315,25 @@ def save():
bouton_valider.pack() bouton_valider.pack()
def nettoyer_ecran(): def nettoyer_ecran():
"""Fonction qui permet de nottoyer le terminal"""
os.system("cls") os.system("cls")
#Fonction qui arrête le programme(Message d'arrêt)
def quitter_programme(): def quitter_programme():
"""Fonction qui arrête le programme(Message d'arrêt)"""
global root global root
root.destroy() root.destroy()
print("Fin du programme, au revoir.") print("Fin du programme, au revoir.")
exit exit
#Fonction qui crée le menu et le structure (O,A,I,N,C,R,S,Q)
def menu(): def menu():
"""Fonction qui crée le menu et le structure (O,A,I,N,C,R,S,Q)"""
global root global root
#Création de la fenêtre principale
root = tk.Tk() root = tk.Tk()
frame=tk.Frame(root) #On lui donne un titre
frame.pack()
root.title("Traitement de l'image") root.title("Traitement de l'image")
#Ensemble de boutons permettant de créer un menu et donnant accès aux diverses fonctionnalités
tk.Button(root, text="Ouvrir l'image et l'afficher", command = ouvrir_image).pack() tk.Button(root, text="Ouvrir l'image et l'afficher", command = ouvrir_image).pack()
tk.Button(root, text="Afficher l'image précédement chargée", command = afficher_image).pack() tk.Button(root, text="Afficher l'image précédement chargée", command = afficher_image).pack()
tk.Button(root, text="Afficher les informations concernant l'image", command = afficher_infos_image).pack() tk.Button(root, text="Afficher les informations concernant l'image", command = afficher_infos_image).pack()
...@@ -316,8 +344,10 @@ def menu(): ...@@ -316,8 +344,10 @@ def menu():
tk.Button(root, text="Effacer la console ", command = nettoyer_ecran).pack() tk.Button(root, text="Effacer la console ", command = nettoyer_ecran).pack()
tk.Button(root, text= "Sauvegarder l'image", command = save).pack() tk.Button(root, text= "Sauvegarder l'image", command = save).pack()
tk.Button(root, text="Quitter le programme", fg = "red", command = quitter_programme).pack() tk.Button(root, text="Quitter le programme", fg = "red", command = quitter_programme).pack()
#Fonction qui maintient le menu en vie grâce à une boucle (On peut l'arrêter en détruisant le menu)
root.mainloop() root.mainloop()
if __name__ == "__main__": if __name__ == "__main__":
menu() menu()
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment