#!/usr/bin/env python # -encoding: utf8- # Pierre Hyvernat # info719 : rappels et compléments de programmation # TP0 import random import Image, ImageDraw import math def degrade(direction, nom, largeur=256, hauteur=256, couleur1=(0,0,0), couleur2=(255,255,255) ): '''crée une image carrée de taille 256x256 pixel contenant un degradé de gris (de blanc à noir). - "nom" contient le nom sous lequelle l'image sera sauvegardée, - "direction" est une chaîne de caractère : . 'D' pour faire un degradé en diagonal . 'V' pour faire un degradé vertical . 'H' pour faire un degradé horizontal ''' im = Image.new("RGB", (largeur, hauteur)) def couleur(ratio): '''interpolation de ratio entre les deux couleurs''' r = couleur1[0] + ratio * (couleur2[0]-couleur1[0]) g = couleur1[1] + ratio * (couleur2[1]-couleur1[1]) b = couleur1[2] + ratio * (couleur2[2]-couleur1[2]) return(int(r), int(g), int(b)) for j in range(hauteur): for i in range(largeur): if direction == 'H': ratio = float(i)/largeur elif direction == 'V': ratio = float(j)/hauteur elif direction == 'D': ratio = float(i+j)/(largeur+hauteur) else: ratio = 0 im.putpixel((i,j),couleur(ratio)) im.save(nom + ".png") def rectangle(im, geom, couleur=(255,255,255)): '''dessine un rectangle horizontal de couleur. - "im" est un objet image (obtenu par "Image.new") - "geom" est un quadruplet (x,y,largeur,hauteur), où "x" et "y" sont les coordonnées du point en haut à gauche du rectangle. ''' x, y, largeur, hauteur = geom for j in range(hauteur): for i in range(largeur): im.putpixel((x+i,y+j),couleur) def disque(im, geom, couleur=(255,255,255)): '''dessine un disque de couleur. - "im" est un objet image (obtenu par "Image.new") - "geom" est un triplet (x,y,r) où "x" et "y" sont les coordonnées du centre et "r" est le rayon. ''' x, y, r = geom for j in range(r): l = int(math.sqrt(r*r - j*j)) for i in range(l): im.putpixel((x+i,y+j),couleur) im.putpixel((x-i,y+j),couleur) im.putpixel((x+i,y-j),couleur) im.putpixel((x-i,y-j),couleur) def cercle(im, geom, couleur=(255,255,255)): '''dessine un cercle de couleur. - "im" est un objet image (obtenu par "Image.new") - "geom" est un triplet (x,y,r) où "x" et "y" sont les coordonnées du centre et "r" est le rayon. ''' ### c'est pas immediat. J'utilise l'algo decrit ici : ### http://cs.unc.edu/~mcmillan/comp136/Lecture7/circle.html ### pour obtenir quelque chose de joli. cx, cy, r = geom x = 0 y = r while(x<=y): im.putpixel((cx+x,cy+y),couleur) im.putpixel((cx-x,cy+y),couleur) im.putpixel((cx+x,cy-y),couleur) im.putpixel((cx-x,cy-y),couleur) im.putpixel((cx+y,cy+x),couleur) im.putpixel((cx-y,cy+x),couleur) im.putpixel((cx+y,cy-x),couleur) im.putpixel((cx-y,cy-x),couleur) x = x + 1 y = int(math.sqrt(r*r - x*x)) def art(nom, geom, nb_fig, m): im = Image.new("RGB", geom) largeur, hauteur = geom for i in range(nb_fig): fig =random.randrange(3) if fig == 0: # disque x = 10+random.randrange(largeur - 20) y = 10+random.randrange(hauteur - 20) r = random.randrange(5,min(hauteur/4,largeur/4,x,y,largeur-x,hauteur-y)) couleur = (random.randrange(256),random.randrange(256),random.randrange(256)) disque(im,(x,y,r),couleur) elif fig == 1: # rectangle x = 10+random.randrange(largeur - 20) y = 10+random.randrange(hauteur - 20) l = random.randrange(10,min(largeur/4,largeur-x)) h = random.randrange(10,min(hauteur/4,hauteur-y)) couleur = (random.randrange(256),random.randrange(256),random.randrange(256)) rectangle(im,(x,y,l,h),couleur) elif fig == 2: # cercle x = 10+random.randrange(largeur - 20) y = 10+random.randrange(hauteur - 20) r = random.randrange(9,min(hauteur/4,largeur/4,x,y,largeur-x,hauteur-y)) couleur = (random.randrange(256),random.randrange(256),random.randrange(256)) cercle(im,(x,y,r),couleur) im.save(nom + ".png") if __name__ == "__main__": largeur = 400 hauteur = 200 im = Image.new("RGB", (largeur,hauteur)) rectangle(im, (10,10,10,10), (255,0,0)) rectangle(im, (100,50,15,15), (0,0,255)) disque(im, (150,100,50), (0,255,0)) cercle(im, (300,100,44), (0,255,255)) im.save("essai.png")