🖼️projets

Creer un convertisseur d'images en ASCII art avec Python

30 mars 2026 5 min de lecture

Qu'est-ce que l'ASCII art et pourquoi c'est génial pour NSI ?

Tu as déjà vu ces impressionnantes œuvres d'art créées uniquement avec des lettres, des chiffres et des symboles de ton clavier ? C'est ce qu'on appelle l'ASCII art (American Standard Code for Information Interchange). Avant l'ère des graphiques haute définition, c'était une façon ingénieuse de représenter des images avec du texte pur.

Pourquoi c'est un projet parfait en NSI ? Parce qu'il fait appel à plusieurs concepts clés du programme :

  • Traitement d'image : Charger, analyser et transformer les pixels d'une image.
  • Manipulation de chaînes de caractères : Construire une représentation textuelle complexe.
  • Algorithmes de conversion : Définir une logique pour associer un niveau de luminosité à un caractère.
  • Bibliothèques Python : Utiliser PIL (Pillow) pour la partie image.

C'est aussi un projet visuellement gratifiant. Tu verras ton portrait ou ton logo préféré se transformer sous tes yeux en une création unique, directement dans ta console ou un fichier texte !

Les outils nécessaires : installer Pillow (PIL)

Pour manipuler des images en Python, nous allons utiliser une bibliothèque extrêmement populaire et puissante : Pillow, qui est une version moderne et maintenue de PIL (Python Imaging Library).

Pour l'installer, ouvre ton terminal (ou l'invite de commandes) et tape :

pip install Pillow

Si tu utilises un environnement comme Thonny ou un notebook Jupyter, l'installation se fait généralement via le gestionnaire de packages intégré. Une fois installée, tu pourras l'importer dans ton script avec :

from PIL import Image

Cette bibliothèque va nous permettre de :

  • Ouvrir des images dans de nombreux formats (JPG, PNG, etc.).
  • Récupérer les dimensions (largeur, hauteur) et les données des pixels.
  • Convertir l'image en niveaux de gris, ce qui est essentiel pour notre projet.
  • Redimensionner l'image, car une image de 4000x3000 pixels donnerait un fichier texte géant !

L'algorithme pas à pas : de l'image au texte

Le cœur du projet réside dans l'algorithme de conversion. Ne t'inquiète pas, on va le décomposer ensemble.

Étape 1 : Préparer l'image

D'abord, on ouvre l'image et on la convertit en niveaux de gris. Pourquoi ? Parce que l'ASCII art repose sur la densité : un caractère "lourd" comme "@" ou "#" représente une zone sombre, tandis qu'un caractère "léger" comme "." ou " " (espace) représente une zone claire. En niveaux de gris, chaque pixel a une valeur unique entre 0 (noir) et 255 (blanc).

Ensuite, on la redimensionne. Les caractères sont plus hauts que larges, donc pour éviter que l'image soit étirée, on ajuste la largeur en conséquence. Une bonne astuce est de diviser la largeur par un facteur (environ 2.5) et de garder la même hauteur.

Étape 2 : Définir la palette de caractères

C'est là que ta créativité entre en jeu ! Tu dois choisir une suite de caractères, du plus "sombre" au plus "clair". Plus la palette est longue, plus les nuances de gris seront détaillées.

Exemple de palette simple à 10 caractères : @%#*+=-:. (note l'espace à la fin pour le blanc).

Exemple de palette plus riche : $@B%8&WM#*oahkbdpqwmZO0QLCJUYXzcvunxrjft/\|()1{}[]?-_+~<>i!lI;:,"^`'.

Étape 3 : Associer un pixel à un caractère

Pour chaque pixel de ton image redimensionnée en niveaux de gris :

  1. Récupère sa valeur d'intensité (entre 0 et 255).
  2. Normalise cette valeur pour qu'elle corresponde à un index dans ta palette. Si ta palette a 10 caractères, un pixel de valeur 0 (noir) prendra le premier caractère (@), et un pixel de valeur 255 (blanc) prendra le dernier (espace).
  3. Ajoute le caractère correspondant à une ligne de texte.

À la fin de chaque ligne de pixels, tu ajoutes un saut de ligne (\n) pour passer à la ligne suivante de l'image.

Étape 4 : Afficher ou sauvegarder le résultat

Une fois la chaîne de caractères géante construite, tu peux simplement l'afficher dans la console avec un print() ou, mieux, l'enregistrer dans un fichier .txt pour la conserver et la partager.

Code complet et explications

Voici un script fonctionnel que tu peux utiliser comme base. Lis bien les commentaires !

from PIL import Image

# 1. Ouvre et prépare l'image
img = Image.open("ton_image.jpg")
img_gris = img.convert("L") # "L" pour Luminance (niveaux de gris)

# 2. Redimensionne (largeur ajustée pour le ratio caractère)
largeur, hauteur = img_gris.size
nouvelle_largeur = 100 # Tu peux ajuster cette valeur
ratio = hauteur / largeur
nouvelle_hauteur = int(nouvelle_largeur * ratio * 0.55) # Facteur 0.55 pour le ratio hauteur/largeur d'un caractère
img_redim = img_gris.resize((nouvelle_largeur, nouvelle_hauteur))

# 3. Définit la palette de caractères
palette = "@%#*+=-:. "
longueur_palette = len(palette)

# 4. Parcourt chaque pixel et construit la chaîne ASCII
ascii_art = ""
pixels = img_redim.getdata() # Liste plate des valeurs de pixels

for i, valeur_pixel in enumerate(pixels):
# Associe la valeur (0-255) à un index dans la palette (0 à longueur_palette-1)
index = int((valeur_pixel / 255) * (longueur_palette - 1))
ascii_art += palette[index]

# Ajoute un saut de ligne à la fin de chaque ligne de l'image
if (i + 1) % nouvelle_largeur == 0:
ascii_art += "\n"

# 5. Affiche le résultat
print(ascii_art)

# 6. Optionnel : Sauvegarde dans un fichier
with open("mon_ascii_art.txt", "w", encoding="utf-8") as f:
f.write(ascii_art)

Pistes pour aller plus loin et personnaliser ton projet

Une fois que ton convertisseur de base fonctionne, amuse-toi à l'améliorer ! Voici quelques idées pour ton projet NSI :

  • Interface graphique (Tkinter) : Crée une fenêtre avec un bouton "Parcourir" pour choisir l'image, un curseur pour ajuster la largeur, et une zone de texte pour afficher le résultat.
  • Couleurs (ANSI) : Dans certains terminaux, tu peux utiliser des codes ANSI pour colorier le texte. Tu pourrais essayer de préserver les couleurs dominantes de l'image originale.
  • Palettes dynamiques : Laisse l'utilisateur choisir sa palette de caractères ("dense", "fine", "symboles").
  • Sortie HTML : Au lieu d'un fichier texte, génère une page HTML qui utilise une police à chasse fixe (comme Courier) pour afficher ton art, ce sera plus propre.
  • Flux vidéo : Défi ultime ! Utilise OpenCV pour capturer le flux de ta webcam et l'afficher en temps réel en ASCII art dans la console. Attention, les yeux !

Ce projet te montre comment un concept simple (associer un nombre à un caractère) peut, avec un peu d'algorithme, donner naissance à quelque chose de vraiment cool. C'est ça, la magie de la programmation ! N'hésite pas à expérimenter, à changer les paramètres et à partager tes plus belles créations.

📚 Pour aller plus loin

Questions fréquentes

Pourquoi mon ASCII art est-il tout étiré ou écrasé ?

C'est un problème classique de ratio ! Les caractères dans une console ou un fichier texte sont plus hauts que larges. Il faut ajuster le redimensionnement. Dans le code, le facteur 0.55 (nouvelle_hauteur = largeur * ratio * 0.55) compense cela. Tu peux jouer avec cette valeur (entre 0.4 et 0.6) pour obtenir le résultat le plus naturel.

Je reçois l'erreur "ModuleNotFoundError: No module named 'PIL'". Que faire ?

Cela signifie que Pillow n'est pas installé dans ton environnement Python. Ouvre ton terminal/console et exécute la commande `pip install Pillow`. Si tu utilises un éditeur comme Thonny, va dans le menu "Outils" > "Gérer les paquets..." et cherche "Pillow" pour l'installer.

Comment choisir la meilleure palette de caractères ?

Il n'y a pas de "meilleure" palette, c'est une question d'esthétique et de contraste. Une palette courte (ex: "@. ") donne un style très pixellisé. Une palette longue (ex: celle avec beaucoup de symboles) permet plus de nuances et de détails. Teste plusieurs palettes sur la même image et choisis celle qui te plaît le plus ! Pour les portraits, les palettes avec des variations de densité comme "@%#*+=-:. " fonctionnent très bien.

Mon image est trop grande, la conversion prend du temps ou le fichier texte est énorme. Comment régler ça ?

C'est normal ! La clé est le paramètre de redimensionnement (`nouvelle_largeur` dans le code). Une largeur de 100-150 caractères est souvent un bon compromis entre détails et lisibilité. Pour une image de 4000px de large, ne garde que 150 pixels (caractères) de large. Le script redimensionne l'image avant traitement, ce qui accélère énormément la conversion et réduit la taille du fichier de sortie.

Puis-je utiliser ce code pour convertir une image en couleur ?

Le code présenté convertit d'abord l'image en niveaux de gris (`img.convert("L")`), donc l'information couleur est perdue. Pour un ASCII art en couleur, c'est plus complexe. Il faudrait : 1) Garder l'image en couleur (RGB). 2) Pour chaque pixel, déterminer sa luminosité (pour choisir le caractère) ET sa couleur dominante. 3) Utiliser des codes de couleur ANSI dans la chaîne de sortie pour colorier le caractère. C'est un excellent défi pour la suite du projet !

Bravo ! Tu as lu cet article
Inscris-toi pour sauvegarder ta progression et gagner des XP
Creer mon compte
ASCII art Pythonimage processing
Pixel