Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- from PIL import Image, ImageDraw # type: ignore
- from math import *
- class bcolors:
- HEADER = '\033[95m'
- OKBLUE = '\033[94m'
- OKCYAN = '\033[96m'
- OKGREEN = '\033[92m'
- WARNING = '\033[93m'
- FAIL = '\033[91m'
- ENDC = '\033[0m'
- BOLD = '\033[1m'
- UNDERLINE = '\033[4m'
- def dist(x: int,y :int,xc :int,yc :int)-> float:
- """La fonction dist permet de calculer la distance entre 2 pixels"""
- return sqrt((x-xc)**2+(y-yc)**2)
- def putPixel(hauteur, largeur, color):
- for x in range(largeur):
- for y in range(hauteur):
- R, V, B = image.getpixel( (x,y) )
- image.putpixel((x,y),(R-color[0],V-color[1],B-color[2]))
- def putLine(x,y,lenght,color):
- if(x+lenght > largeur):
- print(bcolors.FAIL + 'La ligne dépasse la longueur de l\'image totale' + bcolors.ENDC)
- breakpoint
- else:
- print(x,y,lenght)
- x= int(x)
- for a in range(x):
- image.putpixel((a,y),(color[0],color[1],color[2]))
- def drawZone(startx, starty, endx, endy, type):
- print(bcolors.HEADER + f'Création de la zone en cours ...' + bcolors.ENDC)
- startx = int(startx)
- starty = int(starty)
- endx = int(endx)
- endy = int(endy)
- for a in range(startx, endx):
- for b in range(starty, endy):
- R,V,B = image.getpixel((a,b))
- G=(R+V+B)//3
- if type == 'B&W':
- image.putpixel((a,b),(G,G,G))
- elif type == 'filter':
- image.putpixel((a,b),(G,14,G))
- elif type == 'sombre':
- image.putpixel((a,b),(7*R//10,7*V//10,7*B//10))
- elif type == 'clair':
- image.putpixel((a,b),(R+70,V+70,B+70))
- print(bcolors.OKGREEN + f'Zone crée' + bcolors.ENDC)
- # ------------------------------------------------------------------------------- #
- # #
- # CHOIX DE L'IMAGE ET RECUPERATION DE LA LARGEUR ET LONGUEUR #
- # #
- # ------------------------------------------------------------------------------- #
- image = Image.open("champdefleurs.jpg").convert('RGB')
- draw = ImageDraw.Draw(image)
- largeur, hauteur=image.size
- # ------------------------------------------------------------------------------- #
- # #
- # DESSIN DES DIFFERENTES ZONES DANS L'IMAGE #
- # #
- # ------------------------------------------------------------------------------- #
- # H A U T
- draw.line([(0,hauteur//2),(largeur,hauteur//2)], fill=(0,0,0), width=5) # GAUCHE
- draw.line([(largeur//2,0),(largeur//2,hauteur//2)], fill=(0,0,0), width=5) # DROITE
- drawZone(0,0,largeur,hauteur//2,'filter') # 1/2
- drawZone(largeur//2,0,largeur,hauteur//2,'B&W') # 2/2
- # B A S
- draw.line([(largeur//3,hauteur//2),(largeur//3,hauteur)], fill=(0,0,0), width=5)
- draw.line([(2*largeur//3,hauteur//2),(2*largeur//3,hauteur)], fill=(0,0,0), width=5)
- drawZone(0,hauteur//2,largeur//3,hauteur,'sombre') # 1/3
- drawZone(largeur//3,hauteur//2,2*largeur//3,hauteur,'clair') # 2/3
- drawZone(2*largeur//3,hauteur//2,3*largeur//3,hauteur,'filter') # 3/3
- # ------------------------------------------------------------------------------- #
- # #
- # DESSIN DES FORMES DANS LES DIFFERENTES ZONES #
- # #
- # ------------------------------------------------------------------------------- #
- rayon1=min(largeur//9,hauteur//9) #On choisit un rayon égal au minimum entre la largeur et la hauteur, divisé par 5
- x1,y1=largeur/2,(3/4)*hauteur # On définit les coordonnées du centre du cercle, ici égal au pixel au centre de l'image
- # La double boucle "for" qui parcourt tous les pixels (x,y) de l'image :
- for x in range(largeur):
- for y in range(hauteur):
- R, V, B = image.getpixel( (x,y) )
- G=(R+V+B)//3
- if dist(x,y,x1,y1)<=rayon1 : # si la distance entre le pixel(x,y) et le centre (x1,y1) est inférieure au rayon rayon1 alors :
- image.putpixel((x,y),(255-R,255-V,255-B)) # on transforme le code RVB en son négatif
- rayon2=1.5*rayon1
- for x in range(largeur):
- for y in range(hauteur):
- R, V, B = image.getpixel( (x,y) )
- G=(R+V+B)//3
- if dist(x,y,x1,y1)<=rayon2 and dist(x,y,x1,y1)>rayon1: # si la distance entre le pixel(x,y) et le centre (x1,y1) est inférieure au rayon rayon1 alors :
- image.putpixel((x,y),(R,R,R))
- rayon3=1.1*rayon2
- for x in range(largeur):
- for y in range(hauteur):
- R, V, B = image.getpixel( (x,y) )
- G=(R+V+B)//3
- if dist(x,y,x1,y1)<=rayon3 and dist(x,y,x1,y1)>rayon2:
- image.putpixel((x,y),(100-R,100-V,100-B))
- # ------------------------------------------------------------------------------- #
- # #
- # ENREGISTREMENT DE L'IMAGE #
- # #
- # ------------------------------------------------------------------------------- #
- print(bcolors.OKBLUE + 'Dessin fini' + bcolors.ENDC)
- image.save("champdefleursstesssst.jpg", "jpeg")
- image.close()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement