Dessiner pixel par pixel avec la bibliothèque Pillow
Tu as vu qu'une image est une grille de pixels. Avec Python, tu vas colorier ces pixels un par un, grâce à la bibliothèque Pillow. Tu réinvestis les boucles for et les conditions if du cours Python.
Fichiers du thème
Les photos utilisées dans la suite (Ardèche, Eiffel, Gargouille…) sont dans l'archive PhotoNumerique.zip. Décompresse-la dans ton dossier SNT : tes programmes doivent être dans le même dossier que les photos.
MéthodeInstaller Pillow
À faire une seule fois par ordinateur. La bibliothèque s'appelle Pillow, mais on l'utilise avec le nom PIL.
Dans EduPython, menu Outils → Outils → Installation d'un nouveau module.
À la question « Votre choix : », tape 2 puis Entrée.
À la question « Nom du module : », tape pillow puis Entrée.
Attends la fin de l'installation, puis appuie sur une touche quand c'est demandé.
CoursRepérer un pixel
Un pixel est repéré par deux coordonnées \((x\,;y)\). L'origine \((0\,;0)\) est le pixel en haut à gauche. L'axe des \(x\) va vers la droite, mais l'axe des \(y\) va vers le bas.
Coordonnées des pixels : \(y\) augmente vers le bas.
essai.py
from PIL import Image
image = Image.new("RGB", (11, 11)) # image 11 x 11, tout en noir
image.putpixel((0, 10), (0, 255, 255)) # pixel (0,10) en turquoise
image.putpixel((10, 0), (255, 0, 255)) # pixel (10,0) en rosefor i inrange(11):
image.putpixel((i, i), (255, 255, 0)) # diagonale jaune
image.resize((330, 330), Image.NEAREST).show() # agrandit 30 fois pour la voir
image.save("Essai.png")
Le résultat de essai.py, agrandi.
Ligne
Effet
Image.new("RGB", (11, 11))
crée une image couleur de 11 pixels de large et 11 de haut, noire par défaut
Image.new("RGB", (11, 11), (255, 255, 255))
la même image, avec un fond blanc
image.putpixel((x, y), (R, V, B))
colorie le pixel \((x\,;y)\) avec le triplet \((R\,;V\,;B)\)
image.resize((330, 330), Image.NEAREST).show()
affiche une version agrandie : sans elle, une image de 11 pixels est minuscule à l'écran
image.save("Essai.png")
enregistre l'image dans le dossier du programme
Vigilance
Les coordonnées vont de 0 à largeur − 1 : dans une image de 11 pixels de large, le dernier pixel est le numéro 10. Écrire (11, 0) provoque une erreur.
Les valeurs de R, V, B doivent être des entiers de 0 à 255. Un nombre décimal comme 127.5 provoque une erreur : utilise // ou int(...).
Tracer des lignes et des rectangles
Horizontale à la hauteur 5 : for i in range(11): image.putpixel((i, 5), couleur).
Verticale à 7 pixels du bord gauche : putpixel((7, i), couleur).
Diagonale montante : putpixel((10 - i, i), couleur).
Segment : donne deux valeurs à range, le début et la valeur qui suit la fin : range(3, 8) colorie les pixels 3, 4, 5, 6 et 7.
Pour un rectangle, on imbrique deux boucles. Par exemple, un rectangle bleu dont le coin supérieur gauche est le pixel \((1\,;2)\), de largeur 5 et de hauteur 3 :
rectangle.py
bleu = (0, 0, 255)
for x inrange(1, 1 + 5):
for y inrange(2, 2 + 3):
image.putpixel((x, y), bleu)
À retenir
Un pixel se colorie avec image.putpixel((x, y), (R, V, B)).
Les figures se tracent avec des boucles : une pour une ligne, deux imbriquées pour une surface.
On peut ranger une couleur dans une variable : rouge = (255, 0, 0).
ExercicesDessiner pixel par pixel
EX 17Je m'entraîne🌶️prise en main
Exercice 17 — Recopier et comprendre
Recopie essai.py, exécute-le, puis réponds.
Sur quel bord de l'image se trouve le pixel turquoise ? le pixel rose ?
Quelle diagonale est tracée par la boucle : de quel coin à quel coin ?
Que faut-il changer pour obtenir un fond blanc ?
Indice
Compare avec le schéma des coordonnées : \(y\) augmente vers le bas.
💾 NOM_Prenom_ex17.py
EX 18Je m'entraîne🌶️🌶️application
Exercice 18 — La croix rouge
Dessine cette croix rouge sur fond blanc : une image de 9 × 9 pixels formée de cinq carrés de 3 × 3 pixels.
La croix à dessiner.Indice 1
La barre horizontale occupe toute la largeur, sur les lignes 3, 4 et 5.
Indice 2
La barre verticale occupe toute la hauteur, sur les colonnes 3, 4 et 5.
Indice 3
Une seule boucle imbriquée peut colorier les deux barres à la fois.
💾 NOM_Prenom_ex18.py
EX 19Je m'entraîne🌶️🌶️application
Exercice 19 — Deux drapeaux
Dessine le drapeau de l'Italie : une image de 30 × 20 pixels, avec trois bandes verticales de 10 pixels : vert (0, 146, 70), blanc, rouge (206, 43, 55).
Dessine le drapeau des Pays-Bas : une image de 30 × 18 pixels, avec trois bandes horizontales de 6 pixels : rouge (174, 28, 40), blanc, bleu (33, 70, 139).
Indice
Deux boucles imbriquées parcourent tous les pixels. Dans le bloc, un if / elif / else choisit la couleur selon x (bandes verticales) ou selon y (bandes horizontales).
💾 NOM_Prenom_ex19.py
EX 20Je m'entraîne🌶️🌶️application
Exercice 20 — Le damier
Dessine ce damier de 8 × 8 pixels : les pixels dont la somme \(x + y\) est paire sont noirs, les autres blancs.
Le damier à dessiner.Indice 1
Fond blanc, puis un if dans une double boucle.
Indice 2
\(x + y\) est pair quand (x + y) % 2 == 0.
💾 NOM_Prenom_ex20.py
EX 21Je m'entraîne🌶️🌶️🌶️plusieurs étapes
Exercice 21 — Des dégradés
Dessine une image de 256 × 60 pixels dont le pixel \((x\,;y)\) a pour couleur \((x\,;0\,;0)\). Quelles couleurs prévois-tu pour \(x = 0\), \(x = 128\) et \(x = 255\) ?
Dessine une image de 256 × 256 pixels dont le pixel \((x\,;y)\) a pour couleur \((x\,;y\,;128)\). Prévois la couleur des quatre coins avant d'exécuter le programme, puis vérifie avec getpixel.
Indice 1
Les valeurs de \(x\) vont de 0 à 255 : exactement les valeurs possibles d'une couleur !
Indice 2
image.getpixel((255, 0)) renvoie le triplet du pixel \((255\,;0)\).
💾 NOM_Prenom_ex21.py
EX 22Défi🌶️🌶️🌶️🌶️défi
Exercice 22 — Un disque
Dans un repère, un point \((x\,;y)\) appartient au disque de centre \(C(a\,;b)\) et de rayon \(r\) si sa distance au centre est inférieure ou égale à \(r\), c'est-à-dire si :
\[(x - a)^2 + (y - b)^2 \leqslant r^2\]
Dessine sur fond noir un disque blanc de centre \((20\,;20)\) et de rayon 15, dans une image de 41 × 41 pixels.
Modifie le programme pour dessiner un anneau : blanc entre les rayons 10 et 15.
Compte les pixels blancs du disque. Compare à l'aire \(\pi r^2\).
Indice 1
Double boucle sur tous les pixels, et un if avec la condition ci-dessus, écrite avec **2.
Indice 2
Pour l'anneau, deux conditions reliées par and : distance au carré au plus \(15^2\) et au moins \(10^2\).
Indice 3
Un compteur incrémenté dans le if donne le nombre de pixels blancs.
💾 NOM_Prenom_ex22.py
EX 23Projet🌶️🌶️🌶️plusieurs étapes
Exercice 23 — Ma création en pixel art
À toi de créer ! Réalise une image en pixel art de ton choix : un personnage, un animal, un objet, un logo, un motif.
Taille : entre 16 × 16 et 32 × 32 pixels.
Au moins trois couleurs différentes, rangées dans des variables (rouge = (220, 30, 40)).
Au moins une boucle qui trace une ligne ou un rectangle.
Prépare ton dessin sur une feuille quadrillée avant de programmer. Enregistre l'image agrandie avec image.resize(...).save("NOM_Prenom_pixelart.png").
Le programme et l'image sont à déposer sur Pronote. La croix rouge et les exercices précédents sont l'échauffement non noté ; cette création est évaluée.
Critère
Ce qui est regardé
Programme
il s'exécute sans erreur, les couleurs sont nommées, le code est lisible
Boucles
les lignes et rectangles sont tracés avec des boucles, pas pixel par pixel à la main
Création
le dessin est reconnaissable, soigné, avec des couleurs bien choisies
Indice 1
Fais un croquis quadrillé : chaque case est un pixel, et note ses coordonnées.
Indice 2
Commence par le fond et les grandes formes, puis ajoute les détails.
Indice 3
Pour un dessin symétrique, colorie aussi le pixel \((\text{largeur} - 1 - x\,;y)\).