web-dev-qa-db-fra.com

Comment fonctionnent les algorithmes de conversion d'images ASCII art)?

Il existe de jolis sites de conversion gratuits "image vers ASCII art" comme celui-ci: ASCII-art.org

Comment fonctionne un tel algorithme de conversion d'image?

, 
. W, 
 W W @ 
 W, W W 
, W,: W * .W. 
 # WW @WW WW # 
 W WW.WWW WW: W 
 W. WW * WWW # WW @ W 
 *: WW.WWWWWWW @ WWW @ W # 
 + * # WW # WWWWWWWWWWWWW # W 
 W # @WWWWWWWWWWWWWWWWWWW. 
 WW WWWWWWWWWWWWWWWWWWW 
 WW WWWWWWWWWWWWWWWW. .WWWWWWWWWWWWWWWWWWWWW 
 WW @ WWWWWWWWWWWWWWWWW. 
: WWWWWWWWWWWWWWWWWWWWWWWWW: 
 @ WWWWWWWW @ WWW. 
 W * WWWWWW :::: @ WWW ::::: # WWWWW 
 WWWWWW @ ::: + * :. :: @ WWWW 
 WWWWW @: *:. ::.,.:.: WWWW 
 @WWWW #:. :::. . :: #: @ WWW 
: WWW @: #. ::: WWWW: @WWWW 
 WWW # *: W @ * @ W. W: #WWW 
 #WWWW: @ :: :: * WWWW 
 W @ WW * W. ::,. ::::,: + @@ WW #, 
 WWWW ## ,.:. :::.:. .WWW :, 
 @ WWW @: W .. ::::: #. : WWWW 
 WWWW :: * ..:. ::.,. : WWWW 
 WWWW :::.:.:: ::, @ WW @ 
 WWWW:.:,: ,: WW, 
.: #:,: * 
 W +., :::.,: @ 
 W ::.: W 
 @ , W :. , :: * @ * :,. : @W. , @ 
 + ..... *:::. # WWWWW::. #: .... +, 
 @ ... ::: *: ,:: WWWWWWW, * :::: .., # 
: ... :::::: W :, @W :::: * W. : W ::::: ... # 
 @@@@@@@@@@@ W @@@@@ W @@@@@@ W @@@@@ W @@@ @@@@@@@: 
 
55
splattne

Le concept à grande échelle est simple:

  1. Chaque caractère imprimable peut se voir attribuer une valeur d'échelle de gris approximative; le signe "at" @ est visuellement plus sombre que le signe "plus" +, par exemple. L'effet variera selon la police et l'espacement réellement utilisés.

  2. En fonction des proportions de la police choisie, regroupez l'image d'entrée en blocs de pixels rectangulaires de largeur et de hauteur constantes (par exemple, un rectangle de 4 pixels de large et 5 pixels de haut). Chacun de ces blocs deviendra un caractère dans la sortie. (En utilisant les blocs de pixels mentionnés ci-dessus, une image 240w-x-320h deviendrait 64 lignes de 60 caractères.)

  3. Calculez la valeur d'échelle de gris moyenne de chaque bloc de pixels.

  4. Pour chaque bloc de pixels, sélectionnez un caractère dont la valeur d'échelle de gris (de l'étape 1) est une bonne approximation de la moyenne du bloc de pixels (de l'étape 3).

C'est la forme la plus simple de l'exercice. Une version plus sophistiquée prendra également en compte les formes réels des caractères lors de la rupture des liens entre les candidats pour un bloc de pixels. Par exemple, une "barre oblique" (/) serait un meilleur choix qu'une "barre oblique inverse" (\) pour un bloc de pixels qui semble avoir une fonction de contraste de bas à gauche en haut à droite.

94
joel.neely

aalib (dernière version en 2001) est une bibliothèque d'art open source ASCII art utilisée dans des applications comme mplayer. Vous voudrez peut-être consulter son code source pour voir comment il À part cela, cette page décrit plus en détail le fonctionnement de ces algorithmes.

16
codelogic

Vous pouvez également jeter un œil à libcaca (dernière version 2014), qui selon leur site Web présente les améliorations suivantes par rapport à aalib:

  • Prise en charge Unicode
  • 2048 couleurs disponibles (certains appareils ne peuvent en gérer que 16)
  • tramage d'images en couleur
  • opérations avancées de canevas de texte (blitting, rotation)
12
daniels

J'ai trouvé cette article CodeProject écrit par Daniel Fisher contenant une simple implémentation C # d'une image en ASCII conversion artistique algorithme.

Voici les étapes du programme/bibliothèque:

  1. Charger le flux d'images dans un objet bitmap
  2. Niveaux de gris du bitmap à l'aide d'un objet Graphics
  3. Faites une boucle à travers les pixels de l'image (parce que nous ne voulons pas d'un caractère ASCII par pixel, nous en prenons un par 10 x 5)
  4. Pour laisser chaque pixel influencer le caractère ASCII résultant, nous les bouclons et calculons la luminosité de la quantité du bloc 10 x 5 actuel.
  5. Enfin, ajoutez différents caractères ASCII basés sur le bloc actuel sur le montant calculé.

C'est assez simple, non?

BTW: Dans les commentaires de l'article, j'ai trouvé cette implémentation cool AJAX : Gaia Ajax ASCII Art Generator :

[...] Je me sentais obligé de démontrer que cela pouvait facilement être fait dans un ensemble normalisé de technologies Web. J'ai cherché à voir si je pouvais trouver des bibliothèques à utiliser, et j'ai trouvé l'article de projet de code de Sau Fan Lee sur sa bibliothèque .NET ASCII.

P.S .: Lucas (voir commentaires) en a trouvé un autre article CodeProject .

7
splattne