Partie P4 · exercices 17 à 23

Pixel art avec Python

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.

  1. Dans EduPython, menu Outils → Outils → Installation d'un nouveau module.
  2. À la question « Votre choix : », tape 2 puis Entrée.
  3. À la question « Nom du module : », tape pillow puis Entrée.
  4. 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.

0 1 2 3 4 5 0 1 2 3 (3,2) (0,0)
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 rose
for i in range(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")
0 1 2 3 4 5 6 7 8 9 10 0 1 2 3 4 5 6 7 8 9 10
Le résultat de essai.py, agrandi.
LigneEffet
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

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 in range(1, 1 + 5):
    for y in range(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.

  1. Sur quel bord de l'image se trouve le pixel turquoise ? le pixel rose ?
  2. Quelle diagonale est tracée par la boucle : de quel coin à quel coin ?
  3. 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.

0 1 2 3 4 5 6 7 8 0 1 2 3 4 5 6 7 8
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

  1. 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).
  2. 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.

0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7
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

  1. 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\) ?
  2. 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\]
  1. Dessine sur fond noir un disque blanc de centre \((20\,;20)\) et de rayon 15, dans une image de 41 × 41 pixels.
  2. Modifie le programme pour dessiner un anneau : blanc entre les rayons 10 et 15.
  3. 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èreCe qui est regardé
Programmeil s'exécute sans erreur, les couleurs sont nommées, le code est lisible
Bouclesles lignes et rectangles sont tracés avec des boucles, pas pixel par pixel à la main
Créationle 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)\).

💾 NOM_Prenom_pixelart.py + NOM_Prenom_pixelart.png

À retenirSynthèse

Ce que je sais faire

  • Créer une image avec Image.new et colorier un pixel avec putpixel.
  • Repérer un pixel : origine en haut à gauche, \(y\) vers le bas, coordonnées de 0 à largeur − 1.
  • Tracer lignes, rectangles, damiers, dégradés et disques avec des boucles et des conditions.