Il est possible de produire des images à l’aide d’un script python, en exploitant par exemple la bibliothèque turtle de python. Nativement, le module turtle propose un export au format .ps de l’image générée. Ce tutoriel vous permettra d’exporter cette image au format .png
Sommaire
- 1 Exporter une image au format .ps
- 2 Exporter une image au format .ps avec un nom de fichier défini
- 3 Exporter une image au format .png avec une résolution cible
- 4 Un fichier .py qui gère les erreurs
- 5 Rudiments pour le module turtle
- 6 Support technique
- 7 One More Thing
- 8 Evolution à prévoir en 2023
- 9 Articles similaires
Exporter une image au format .ps
Nativement, le module turtle de python est capable d’exporter une image au format .ps (découvrir le .ps) comme dans l’exemple ci-dessous.
from turtle import * list1 = ["blue","cyan", "pink", "magenta", "purple"] for i in range(42) : color(list1[i%5]) pensize(42) forward(4*i) right(42) image = getcanvas() image.postscript(file="image.ps", colormode='color')
Cette image est crée puis enregistrée dans le même dossier que celui qui contient le script .py au format .ps
Cette image n’est pas affichée par l’explorateur Windows, il ne gère pas nativement ce format.
Il est possible de l’ouvrir et de la modifier modifiée sous GIMP, et éventuellement de l’exporter au format .png depuis ce logiciel libre.
Cette solution présente 4 défauts :
- Chaque exécution du script va écraser l’image précédente,
- Le nom du fichier est non pertinent,
- Le format .ps n’est pas directement utilisable.
- La taille de l’image n’est pas gérée.
Exporter une image au format .ps avec un nom de fichier défini
from turtle import * # Uniquement des lettres, des chiffres, un tiret. Rien d'autre. titre = "Spirale - construite avec turtle" # Définir le titre de la fenêtre de turtle + propagande ^^ title(titre+" | Au lycée, la meilleure spécialité, c'est la spé NSI") list1 = ["blue","cyan", "pink", "magenta", "purple"] for i in range(42) : color(list1[i%5]) pensize(42) forward(4*i) right(42) image = getcanvas() image.postscript(file=titre+".ps", colormode='color')
La fenêtre turtle à désormais un titre :
Ce titre est exploité pour générer un fichier correctement nommé :
On va maintenant ajouter un identifiant, presque unique pour que les images ne s’écrasent pas.
from turtle import * from datetime import datetime # Uniquement des lettres, des chiffres, un tiret. Rien d'autre. https://learn.microsoft.com/fr-fr/windows/win32/fileio/naming-a-file titre = "Spirale - construite avec turtle" # Définir le titre de la fenêtre de turtle + propagande ^^ title(titre+" | Au lycée, la meilleure spécialité, c'est la spé NSI") list1 = ["blue","cyan", "pink", "magenta", "purple"] for i in range(42) : color(list1[i%5]) pensize(42) forward(4*i) right(42) image = getcanvas() nom_du_fichier=titre+"_"+hex(datetime.now().microsecond)+".ps" image.postscript(file=nom_du_fichier, colormode='color')
L’image sera générée aura un identifiant presque unique, codée en base 16.
Après réflexion, un nombre aléatoire généré par le module random
aurait été préférable et plus simple 🤔
Si les deux dernières lignes sont exécutés trois fois, on obtient 3 images (identiques) mais ayant chacune un identifiant unique.
Remarque : Il est possible, que parfois une une nouvelle image écrase une précédente, mais la probabilité est faible.
Exporter une image au format .png avec une résolution cible
Pour exporter également les images au format .png, on va avoir besoin du module PILLOW de python et de ghostscript.
- Installer ghostscript : https://ghostscript.com/releases/gsdnld.html
- Installer PIL, sous Thonny
Outil > Ouvrir la console système>pip install pillow
- Redémarrer l’ordinateur.
- Redémarrer Thonny. (ceinture + bretelle 😩)
Outil > Ouvrir la console système > pip show PILLOW
Vous devriez voir la version de PIL affichée
Le script final spécifie le format de l’image (ici en 720p), génère le fichier au format .ps et le fichier au format .png.
from turtle import * from random import randint from PIL import Image # Uniquement des lettres, des chiffres, un tiret. Rien d'autre. https://learn.microsoft.com/fr-fr/windows/win32/fileio/naming-a-file titre = "Spirale - construite avec turtle" # Définir le titre de la fenêtre de turtle + propagande ^^ title(titre+" | Au lycée, la meilleure spécialité, c'est la spé NSI") # definir la taille de la fenêtre en 720p (Largeur, Hauteur, abscisse départ, ordonnée du départ) setup(1280, 720, 0, 0) # ============== MON SCRIPT PYTHON ============== list1 = ["blue","cyan", "pink", "magenta", "purple"] for i in range(2*42) : color(list1[i%5]) pensize(42) forward(4*i) right(42) # ============== GENERER DES IMAGES AUTOMATIQUEMENT ============== image = getcanvas() nom_du_fichier_sans_extension=titre+"_"+hex(randint(2**30+2**25,2**30+2**25+2**24-1))[2:] # Génère un fichier .ps image.postscript(file=nom_du_fichier_sans_extension+".ps", colormode='color') # Ouvre le fichier .ps et génère le fichier .png psimage = Image.open(nom_du_fichier_sans_extension+".ps") psimage.save(nom_du_fichier_sans_extension+".png")
A noter : Pour l’instant l’export ne respecte pas la résolution imposée (720p), l’image générée fait 959 par 540 pixels. Des investigations sont en cours pour comprendre le problème.
Un fichier .py qui gère les erreurs
Les élèves ne lisent pas les tutoriels, ils préfèrent appeler l’enseignant car « cela ne marche pas ».
Le fichier .py ci-dessous gérera ce problème et les deux erreurs classiques probables.
Si l’élève n’a pas suivi le tuto ou qu’il n’a pas réussi à installer les modules requis, l’image .png ne sera pas générée mais le script ne plantera pas.
try
, except
pour une gestion propre des plantages.
try: from PIL import Image pillow_installed = True except: print("Oops! - ModuleNotFoundError: No module named 'PIL' - RTFM :") print("https://nsi.xyz/py2png") pillow_installed = False
Rudiments pour le module turtle
A lire ici : Découvrir le module turtle de python
Support technique
Aucun support technique ne sera assuré concernant ce tutoriel.
En cas de problème, vous pouvez toujours répondre à ce message sur twitter mais sans garantie de réponse 😉
One More Thing
Le code final formate le nom du fichier avec
randint(2**30+2**25,2**30+2**25+2**24-1)
Pourquoi 230+225 ?
Evolution à prévoir en 2023
1. Générer les images à l’aide d’une fonction, afin de pouvoir l’appeler à plusieurs moments, utile pour écrire l’article de présentation.
2. Intégrer ceci :
Tester ceci (aussi dans un mail reçu le 13 nov. 2022 09:50)
Enseignant de mathématiques et de spécialité NSI, Lycée Louis Pasteur d’Avignon.
Aime compter jusqu’à 666 mais s’arrête souvent à 42.
Auteur du livre Découvrir la calculatrice NumWorks.