Aller au contenu

Asciimage

Ce projet propose d'implémenter un programme qui convertis une image "classique" en une représentation sous forme d'une chaîne de caractère.

Par exemple, cette image de Marie Curie :

Marie curie

sera convertie sous la forme :

............................................................. ...  ......
.................................................................      ..
.......................................................  .......        .
......................................................  . ......       ..
......................................................... . .  ..     ...
.............................................................  .      ...
........................................................... .  .      ...
............................................................   ..     ...
.......................................................... . .         ..
.......................................................... . .          .
................................--***---..................              .
.............................--*ooooooo*--............. .  .           ..
...........................-*ooooooooooo*--............ ....           ..
.........................-o@@@@ooooo*-***----........   .. .. .        ..
........................-o@@@@@oo****oooo***-........ .  ...  ..        .
......................-*@@@@@@o****-*ooo**----..............  ..        .
....................--o@@@@@@o***-****o**o*-----.................       .
....................-o@@@@@oo***----**--**o**-----...............       .
....................*@@@@@o***----**----*-*o****---........  ....      ..
...................-o@@@@@oo********--**-***oooo--oo-............     ...
...................*o@@@@@ooooooo************o@o**o@*..............    ..
..................-o@@@@@@@@@@@@oo****-******oooo*o@o-.............    ..
..................*o@@##@@@@@@@@@oo**------***ooo*o@@-...... ......     .
.................--o##########@@@@@ooo********o*-*oo@*..........  .     .
.................--@##@#########@@@@@@ooooooo@o***oo@o-.........        .
..................*@#@###########@@@@@@@@oo@@@o*-***o@*...........    ...
..................o#################@@##@@@@oooo*--*o@*-...........   ...
.................-@##################@@@@@@@@o*o****o@*.......... ... ...
.................-@##################@@@@@@@@o**ooooo@o-.................
..............---*o#################@@@@@@@@oo***oooo@@*-...  ...........
...............-*o@################@@@@@@@@@oo***oo@@@@*-.... ...........
................-*o################@@@@@@@oo*****@@@@@@**................
................-*o###############@@@@@@@@@o*****oo@@@@*--...............
................-*o##########@@@@@@@@@@@@@@oo*****ooo@o*-................
................--*@########@@@@@@@@@@@@@@@@o**--****oo----.......    ...
.................--*@@###@@@oo@@oooooooo@@@@@o*******o*--.......      ...
..................-*o@#@o*****ooo**----***oo@@o**--**oo--.......  .......
...................*@@#o---..*oo*--....-----*oooo--**oo**-..... .. ......
..................-*o##*-*-..*o@o*--.--...---o@@o*-***o***-..............
.................**oo##o*o-.-*@#@o*--*o.-*--*o@@@o-****-**--....   ......
................-oo*o####@oooo##@o***ooooo**o@@@@o*---------.....   .....
...............-***oo#####@@@###@@oooo@@o@@@@@@@oo**-**-*---.....   .....
...............-*-*oo######@####@@oooo@@@@@@#@@oo***-*-----..............
................--**o#####@#####@@oooooo@@@@@@ooo*-*oo-----..............
.................-***###########@oooo@@o@@@@oooo**-*o*-----..............
..................-**@##########@ooo*o@@@oooooo**--*o*.---...............
..................---o#####@@##@oooo*o@@@ooo*****--**............. .. ...
...................--o####@@ooo**-.-*oo@@ooo*****-.-........ ........ ...
....................-*@##@@o@@o-...-oooooooo****--.............. .... ...
........ ...........--o##@@o###o*-*ooooooo*****--................. .. ...
....................-*o##@@@###@@ooooooo*****----...........  ....... ...
.....................-*@#@@@@##@@oooooo******----........  ....  .... ...
...... ....... .......-o#@#o*o***--***********----....... ...    .... ...
........ .............-*##@*o#@o****---*oo****--*-............      .....
........................@#@@##@o@o******o****--***...  ..... .      .....
.. ..... ..  ...........*####@*---**oo******-.-***.    .....       ......
.....   ...  ............@####@@oooooo****--..-**o*.. ... ..        .....
.....    .. .  ..........-@#####@@@@o***--...--**oo-. ... .  .    .... ..
........ .. .     ........-o###@@@oo***-.....--*ooo-.   . . ..     ......
...........................-o@@oo**---......--**oo*-.   ..... .  . ......
......  ..  ................*oo*--.........---***--*       ..  ..........
......   .   ...... ........*-o@o--.......---***-...       ..  ..........
........ .  ...............-@--@@o--......---**-..        ...    ........
......   ..................*@-.@@@*---..--**--oo.        ...  ..  .......
......   .... .............**..o@@o**----**--*o*-.       ...  ...  ......
..........  ...............o*. *@@@o*********-. ..       ...  .. ........
......     ...............-@*. *@@@o****o*-o*.  .      ..  .   ....   ...
......   .................-o-..-@@@ooooo*.*o-          .  ..  .....  ....
.......  .................-o-..-@@@o@@o*-.*o-              .  ...........
.......  .................-@***-o#@@@@ooo*----.               ...........
....... ..................o@@o--*@#@--*@@- ....           . .............
..........................-.     -o@* .oo. ...            . .............
...........................        .--..-. ...         .  ...............
...... ............ ......... ..  ..-o*.    .              ..............
...................    ...... ..  .-*@*-..-.               ..... ........
..... ....................... .......o*- .*.      .        ..............
............................. .-oo-..*o- -*        .      ....... .......
..... .......................  -@o--*@#* -.     .     ...................
..... ....................... .-*o*o@@* .-.    ... .     ................
..... .......................  -*@@#@o....   ... ....  .   ..............
...   .......................  .o@@#o*...    .. ..  . ...................
...  ........................  -@o*oo-...    . ...   . .... .... ........
.   .........................  o@--*@o..... .. .       ...  .............
.  ...... ...................  o@--o#o......   ..   .. ..  ..............
.   ..... ...................  -o--o*....  ..  .. .....   ...............
.   ..... ...................  .@oo@. ..   ...... .....  ................
.  .....  ... .. ............. -@@@o.     ..      . .   . ...............
.  .....  ...    . ..........  .o***.    ...    . ...  .......  .........
.  ...    ..       .... .....  ......    ...    .... ........ ...........
.         ..       ...   .. .   ...        ..   ..   .........  .. ......
.          .       .... ..  .   ...                 ..   .... ...........
.                    .      .   ...      ...        ..   .. . ...........
.                           .   --        ....     ... ...... .... ......
.                           .   ..        ..      .. ... ..   .. ........
.                                          ..   ..  ..... ..  ...........
.                                                .. .    .   ............
.                                                 .        . ............
.                                                       .. .. ...........
.                                               .      ... ..   .........
.                                                   ...... ..   . .......

Principe

Pour faire simple, une image est une grille de pixels. Chaque pixel à une valeur qui réprésente un niveau lumineux. Dans une image en couleur, un pixel exprime la luminosité de trois couleurs, appelés canaux : Rouge, Vert et Bleu, sous forme de trois nombres de 0 à 255. 255 représente une forte luminosité, alors que 0 représente une absence de luminosité. Le site colorpicker.fr permet de modifier la luminosité des canaux rouge, bleu et vert et de voir la couleur obtenue.

TODO schema ici

Dans une image en nuances de gris, les pixels représentent une luminosité unique, allant de 0 (noir) à 255 (blanc).

TODO schema ici

Pour convertir une image en une chaîne de caractère qui lui ressemble, on commence par convertir l'image en nuances de gris si elle ne l'est pas déjà. Ensuite, parcours tous les pixels de l'image, ligne par ligne. A chaque pixel que l'on observe, on fait correspondre un caractère, que l'on ajoute à la chaîne. Quand on change de ligne dans l'image, on ajoute un retour à la ligne dans la chaîne.

TODO schema ici

On choisit le caractère en fonction de la luminosité du pixel. Plus le pixel est lumineux, et plus on choisira un caractère qui occupe de la place à l'écran. Au départ, on se limitera à quelques caractères seulement, par exemple :

Valeur pixel Caractère
0-40 @
41-80 #
81-120 o
121-160 *
161-200 -
200-240 .
241-255

Mais on a un problème : si notre image fait beaucoup de pixels de largeur, par exemple 1000, on obtiendra un texte de 1000 caractères de largeur, qui sera trop large pour la plupart des affichages textuels. Avant de convertir l'image, on va donc la redimensionner pour lui donner une taille plus raisonnable, par exemple, en limitant sa largeur à 100 pixels.

Dans notre code, on va utiliser une bibliothèque de manipulation d'image, Pillow. Il se peut qu'elle soit installée sous forme d'une autre bibliothèque, PIL, mais celà revient au même dans notre cas.

Au long de ce projet, on va se demander comment vérifier que le code que l'on a écrit marche.

Etapes

  • Chargement et passage d'une image en niveau de gris avec Pillow.
  • Limitation de la largeur en préservant le ratio hauteur/largeur.
  • Création de la chaîne représentant une image.

Extensions

  • Options d'amélioration pour la console
  • Ajout de différentes conversions.
  • Ajout d'un menu pour choisir l'image, le fichier de sortie, et contrôler la taille de l'image. Eventuallement menu robuste.
  • Consolidation du code.
  • Conversion "retour" : passer d'une chaîne à une image.