C’est la séance [[1B3]] de la [[http://isn.irem.univ-mrs.fr/|formation]] 2013-2014. Le but de ce sujet de TP est d’introduire l’utilisation de modules en Python, à partir de l’exemple de la bibliothèque Pillow : celle-ci permet de manipuler facilement des fichiers d’images dans des formats variés. La dernière partie du TP fait le lien avec les algorithmes de tris vus en cours ce matin. == Préambule == Pour l’installation éventuelle de Pillow, des instructions sont disponibles sur [[Manipulation d'image en Python 3|une page séparée]]. Avant de commencer, je vous suggère d’aller piocher une image de test pas trop grosse (disons au maximum 1024 pixels dans chaque dimension). À défaut en voilà deux, obtenues à partir d’une [[https://commons.wikimedia.org/wiki/File:Tiger-2.jpg?uselang=fr|photo]] mise à disposition par Hans Stieglitz sur les ''[[https://commons.wikimedia.org/wiki/Main_Page?uselang=fr|Wikimedia commons]]'', et soumise à la licence [[ http://creativecommons.org/licenses/by-sa/3.0/deed.fr|CC-BY-SA 3.0]] : * [[attachment:../Filtres d’image/tigre.jpg|tigre.jpg]] * [[attachment:../Filtres d’image/tigrenb.png|tigrenb.png]] == Utilisation du module Pillow == === Ouverture et conversion de fichiers === Le bout de code suivant convertit le fichier `tigre.jpg` (au format JPEG) en `tigre.png` (au format PNG) : {{{#!highlight python import PIL.Image as Image im = Image.open(r'tigre.jpg') im.save(r'tigre.png') }}} Essayez chez vous. Première difficulté : comment expliquer à Python où aller chercher les fichiers ? {{{#!highlight python import os os.chdir('/le/chemin/vers/le/bon/dossier') }}} /!\ Le répertoire courant est la base à partir de laquelle le programme cherche un fichier quand on donne un chemin relatif. C’est différent du chemin de recherche des modules python, qui est situé dans la variable ``sys.path`` (en fait c’est une liste de chemins). Testez. === Obtenir des informations sur les objets Python === Dans un interpréteur, essayez successivement : {{{#!highlight python import PIL.Image as Image help(Image.open) help(Image) im = Image.open(r'tigre.jpg') print(im.format,im.size,im.mode) help(im.save) help(im) print(dir(im)) print(im.save.__doc__) }}} Questions : * que se passe-t-il si on oublie la première ligne ? que fait `help(PIL.Image)` ? * comment interprétez-vous l’attribut `im.mode` ? * comment obtenir la valeur d’un pixel ? quel est la forme du résultat pour une image en couleur ? en niveaux de gris ? * comment modifier la valeur d’un pixel ? * comment convertir facilement une image couleur en niveaux de gris ? === Dessin basique === Écrivez une fonction `croix(im)` qui dessine une petite croix au centre de l’image `im`. Testez de la manière suivante : * sauvez votre script par exemple sous le nom `croix.py` * dans un interpréteur, tapez les lignes suivantes : {{{#!highlight python from croix import croix import PIL.Image as Image im=Image.open(r'tigre.jpg') croix(im) im.save(r'tigre_test_croix.png') }}} Ajoutez des arguments optionnels à la fonction pour permettre à l’utilisateur de choisir la taille et la couleur du motif. Ça devrait commencer par quelque chose comme : {{{#!highlight python def croix(im, taille=10, couleur=0): ... }}} === Dessin plus avancé === Essayez les lignes suivantes : {{{#!highlight python from PIL.ImageDraw import Draw dessin = Draw(im) l,h = im.size dessin.line([l//2-10,h//2,l//2+10,h//2]) dessin.line([l//2,h//2-10,l//2,h//2+10]) dessin.ellipse([l//2-8,h//2-8,l//2+8,h//2+8]) im.save(r'test_dessin.png') }}} Explorez les méthodes de dessin disponible (`help(dessin)`). == Voir comment on trie == === Prélude === Écrivez une fonction `valeurs(nombre)` qui génère une liste de valeurs aléatoires entre 0 et 255. Vous aurez besoin de la fonction `randint` du module `random`. === Trier avec des bulles === Implémentez le tri à bulles vu ce matin. Écrivez ensuite une fonction `voir_bulles(liste)` qui partant d’une liste de `n` valeurs à trier, construit une image de largeur `n` : chaque ligne représente une étape de l’algorithme de tri, en associant par exemple à chaque valeur `x` un pixel `(x,255-x,0)`. Combien de lignes faut-il prévoir ? === D’autres tris === Faites le même travail pour le tri par sélection et/ou par insertion.