Consignes

Ce TP ne sera pas noté. Je vous encourage quand même à le faire « sérieusement » et m'envoyer votre TP pour avoir des retours.

Pour ce TP comme pour les suivants, la pièce la plus importante sera un fichier tp0-nom-prenom.py contenant votre programme. Le seul fait que votre programme fonctionne ne suffit pas pour avoir une bonne note. Les points suivants seront pris en compte :

  1. l'architecture de votre programme (code découpé en fonctions etc.),
  2. la lisibilité de votre programme (choix pertinent pour les noms de variables etc.),
  3. la présence de commentaires aux endroits appropriés,
  4. la présence de documentation pour vos fonctions.

Certaines questions appellent à une réponse que vous pouvez mettre en commentaire dans votre fichier tp0-nom-prenom.py. Si vous le souhaitez vraiment, vous pouvez aussi m'envoyer un rapport de TP. Le format de ce rapport sera au choix, mais par ordre de préférence :

Liens utiles


1. PIL et les images

La bibliothèque PIL (Python Imaging Library) contient un ensemble de fonction pour manipuler des images. Cette bibliothèque ne fait pas partie des bibliothèques standards de Python ; vous devrez donc l'installer si vous voulez travailler chez vous.

Voici par exemple un morceau de programme Python qui déclare une image, dessine un point au milieu et sauve l'image dans mon_image.png:

import Image

largeur, hauteur = 100,100
im = Image.new("RGB", (largeur, hauteur))
im.putpixel((largeur/2, hauteur/2), (255,255,255))
im.save("mon_image.png")

Voici, avec des détails, ce qu'il se passe :

  1. import Image : ceci permettra d'accéder à la bibliothèques Image.
  2. largeur, hauteur = 100,100 : on initialise 2 variables largeur et hauteur
  3. im = Image.new("RGB", (largeur, hauteur)) : on initialise une variable im qui dénotera une image. La fonction Image.new a 2 arguments obligatoires et 1 facultatif :
    • le type d'image : "RGB", voir plus bas
    • un couple largeur, hauteur pour la dimension de l'image
    • la couleur initiale de l'image.
  4. im.putpixel((largeur/2, hauteur/2), (255,255,255)) : on dessine un point aux coordonnées (largeur/2, hauteur/2) en utilisant la couleur (255, 255, 255). (Voir plus bas.)
  5. im.save("mon_image.png") : on sauve l'image finale dans le fichier mon_image.png

Remarques :

Écrivez le corps de la fonction suivante :

def degrade(direction, nom):
	'''crée une image carrée de taille 256x256 pixel contenant un
dégradé de gris (de blanc à noir).
 - "nom" contient le nom sous lequel l'image sera sauvegardée,
 - "direction" est une chaîne de caractère :
   . 'V' pour faire un dégradé vertical
   . 'H' pour faire un dégradé horizontal
   . 'D' pour faire un dégradé en diagonal
'''

Votre fichier tp0.py ne devra rien faire tant qu'on n'a pas utilisé cette fonction. Autrement dit, le simple fait de choisir "Run" dans Idle (ou appuyer sur la touche F5) ne devra rien afficher et ne devra pas créer d'image.

Modifiez la fonction précédente pour qu'elle prenne en plus deux arguments optionnels supplémentaires : largeur et hauteur. Ces arguments auront 256 comme valeur par defaut.

Attention : il faut que le dégradé parte du noir et aille jusqu'au blanc.

Modifiez a nouveau la fonction précédente pour lui donner deux arguments supplémentaires optionnels : couleur1 et couleur2. Chacune de ces couleurs sera données par un triplet (r,g,b) et leur valeur par defaut seront (0,0,0) et (255,255,255).

2. Quelques figures

Écrivez la fonction

def rectangle(dessin, geom, couleur=(255,255,255)):
	'''dessine un rectangle horizontal de couleur.
 - "im" est un objet image (obtenu par "Image.new")
 - "geom" est un quadruplet (largeur,hauteur,x,y), où "x" et "y" sont
    les coordonnées du point en haut à gauche du rectangle.
'''

Écrivez une fonction disque similaire.


Bonus : essayez d'écrire une fonction cercle. Décrivez comment vous vous y prenez et les problèmes que vous rencontrez.

En utilisant le module Random, écrivez une fonction art qui génère une image aléatoire contenant des disques et des rectangles. Choisissez des arguments pertinents pour pouvoir choisir les paramètres de votre image finale.

Voici un exemple de ce que vous pourriez obtenir :