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 PillowSi 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 ImageCette 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 :
- Récupère sa valeur d'intensité (entre 0 et 255).
- 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).
- 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
OpenCVpour 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.
