Dessin pixel par pixel en Python

dimanche 20 juillet 2025



en cours de rédaction


1 – Des boîtes noires

?

from tkinter import Tk, Canvas

# Attention, on choisit ici d'écraser la fonction prédéfinie « open »
from PIL.Image   import new, open
from PIL.ImageTk import PhotoImage


# Création d'une image de taille (en pixels) Largeur x Hauteur
def CréerDessin(Largeur, Hauteur) :
    I = new("RGB", (Largeur, Hauteur), "white")
    return I


# Affichage dans une fenêtre TKinter
def Afficher(I) :
    
    # Création de la fenêtre
    F = Tk() ; F.title("Mon dessin")
    
    # On met un canevas sur cette fenêtre...
    (Largeur, Hauteur) = I.size
    C = Canvas(F, width = Largeur, height = Hauteur, background = "#fff")
    C.pack()
    
    # ...on place l'image au centre de ce canevas...
    PhImg = PhotoImage(I)
    X = 1 + Largeur // 2 ; Y = 1 + Hauteur // 2
    C.create_image((X, Y), image = PhImg)
    
    # ...et on affiche la fenêtre (en écoutant les événements : le programme
    # poursuit son exécution jusqu'à ce que la fenêtre soit fermée).
    F.mainloop()


>>> I = CréerDessin(1920, 1080)
>>> Afficher(I)
que du blanc

# Chargement d'une image depuis un fichier du disque dur
def OuvrirDessin(Fichier) :
    I = open(Fichier).convert("RGB")
    return I

# Sauvegarde de l'image sur le disque dur
def SauverDessin(I, Fichier) :
    I.save(Fichier)



2 – Premiers exemples de dessins

?

# Carré de taille (en pixels) L x L, centré sur la fenêtre
def CarréCentré(Largeur, Hauteur, L, Couleur) :
    I = CréerDessin(Largeur, Hauteur)
    Marge_à_gauche = (Largeur - L) // 2
    Marge_en_haut = (Hauteur - L) // 2
    for px in range(Marge_à_gauche, Marge_à_gauche + L) :
        for py in range(Marge_en_haut, Marge_en_haut + L) :
            I.putpixel((px, py), Couleur)
    Afficher(I)


>>> BLEU = (40, 60, 255)
>>> CarréCentré(1920, 1080, 400, BLEU)
un carré bleu sur fond blanc

# Damier à deux couleurs, avec des cases carrées de L x L (en pixels)
def Damier(Largeur, Hauteur, L, Couleur_1, Couleur_2) :
    Couleurs = [Couleur_1, Couleur_2]
    I = CréerDessin(Largeur, Hauteur)
    for px in range(Largeur) :
        for py in range(Hauteur) :
            # Une opération arithmétique astucieuse donne le numéro de la couleur à utiliser
            k = ((px // L) + (py // L)) % 2
            I.putpixel((px, py), Couleurs[k])
    Afficher(I)


>>> NOIR  = (0, 0, 0)
>>> BLANC = (255, 255, 255)
>>> Damier(1920, 1080, 75, BLANC, NOIR)
un damier noir et blanc