J_Bernon

Pixelliser une image

Nov 9th, 2019
272
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. from PIL import Image
  2. import tkinter as tk
  3. from tkinter import filedialog
  4.  
  5. def pixellise(res):
  6.     #On utilise le module tkinter pour ouvrir une fenêtre
  7.     #afin de sélectionner le fichier à traiter.
  8.     #Le chemin de ce fichier est enregistré dans chemin_fichier
  9.     popup=tk.Tk()
  10.     chemin_fichier =  filedialog.askopenfilename(initialdir = "./",title = "Select file",filetypes = (("Images","*.bmp *.jpg"),("all files","*.*")))
  11.     popup.destroy()
  12.     image=Image.open(chemin_fichier)
  13.    
  14.     #On récupère les dimensions de l'image    
  15.     (largeur,hauteur)=image.size
  16.  
  17.     #On détermine quelle est la plus grande dimension : longueur ou largeur
  18.     pix_max=max(largeur,hauteur)
  19.    
  20.     #On détermine le 'pas' de l'image pixellisée, c'est à dire à combien de pixels
  21.     #de l'image de départ correspondra un pixel de l'image d'arrivée
  22.     pas=pix_max//res
  23.     largeur_finale,hauteur_finale=int((largeur//pas)*pas),int((hauteur//pas)*pas)
  24.    
  25.     #On crée une image vide aux dimensions de l'image d'origine
  26.     imagearrivee=Image.new('RGB',(largeur_finale,hauteur_finale))
  27.  
  28.     #Si jamais on a donné un nombre de pixels supérieur à la résolution decode
  29.     #l'image d'origine, le programme s'arrête et renvoie la valeur "Faux"    
  30.     if pas==0:
  31.         return False
  32.        
  33.     #On va prendre successivement dans l'image des carrés contenant "pas" pixels en hauteur et en largeur
  34.     #On va ensuite faire la moyenne des couleurs sur chaque composante rouge, vert, bleu
  35.     for y in range(int(hauteur_finale/pas)):
  36.         for x in range(int(largeur_finale/pas)):
  37.             couleur=[0,0,0]
  38.            
  39.             for a in range(pas):
  40.                 for b in range(pas):
  41.                     pixel=image.getpixel((x*pas+a,y*pas+b))
  42.                     couleur[0],couleur[1],couleur[2]=couleur[0]+pixel[0],couleur[1]+pixel[1],couleur[2]+pixel[2]
  43.            
  44.             couleur[0],couleur[1],couleur[2]=couleur[0]//pas**2,couleur[1]//pas**2,couleur[2]//pas**2
  45.             couleur=(couleur[0],couleur[1],couleur[2])
  46.            
  47.             #Dans l'image finale, on dessine un carré de "pas" pixels en long et en large de la couleur moyenne que l'on vient de calculer
  48.             imagearrivee=dessine_carre(imagearrivee,x*pas,y*pas,pas,couleur)
  49.    
  50.     #On enregistre l'image traitée
  51.     imagearrivee.save("image"+str(res)+".jpg")
  52.     #On affiche l'image
  53.     imagearrivee.show()
  54.     return True
  55.  
  56. #cette fonction dessine un carré dans une image, de la couleur indiquée
  57. def dessine_carre(image,x_top,y_top,cote,couleur):
  58.    
  59.     for x in range(x_top,x_top+cote):
  60.         for y in range(y_top,y_top+cote):
  61.                 image.putpixel((x,y),couleur)
  62.    
  63.     return image
RAW Paste Data