2008-12-27 7 views
51

Il y a une belle "image à l'art ASCII" libre sites de conversion comme celui-ci: ASCII-art.orgComment fonctionnent les algorithmes de conversion d'image ASCII art?

Comment un tel travail de l'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# [email protected] W    
       * :[email protected]@W #   
       +* #WW#WWWWWWWWWWWWW# W   
       W# @WWWWWWWWWWWWWWWWW W   
       WW WWWWWWWWWWWWWWWWWW W   
       WW [email protected]#   
      ,WW.WWWWWWWWWWWWWWWWWWWWW   
       [email protected]   
      : WWWWWWWWWWWWWWWWWWWWWWWW :  
      @ [email protected]@@WWWWWW.   
      W*WWWWWW::::@WWW:::::#WWWWW   
      [email protected]:: :+*:. ::@WWWW   
      [email protected]:*:.::  .,.:.:WWWW   
      @WWWW#:.:::.  .:: #:@WWW   
      :[email protected]:#. ::  :WWWW:@WWWW   
      WWW#*:[email protected]*@W  . W:#WWW   
      #WWWW:@  :: :: *WWWW   
      [email protected]*W .::,.::::,:+ @@WW#,  
      WWWW## ,,.: .:::.: . .WWW:,  
      @[email protected]: W..::::: #. :WWWW   
      WWWW:: *..:. ::.,. :WWWW   
      WWWW:: :.:.: : :: ,@[email protected]   
      WWWW: .:, : ,,  :WW,   
      .: #   : ,  : *   
       W + ., ::: ., : @   
       W ::    .: W   
      @,,,W:. ,, ::*@*:, . :@W.,,@  
     +.....*: : : .#WWWWW: : .#:....+,  
     @...:::*:,, : :WWWWWWW, , *::::..,# 
     :...::::::W:, @W::::*W. :W:::::...# 
    @@@@@@@@@@@[email protected]@@@@[email protected]@@@@@[email protected]@@@@[email protected]@@@@@@@@@: 

+1

Pour la génération de bannière ASCII dans .NET, consultez https://github.com/drewnoakes/figgle –

Répondre

85

Le concept grand niveau d'image est simple:

  1. Chaque caractère imprimable peut se voir attribuer une valeur approximative de gris; le signe "at" @ est évidemment visuellement plus sombre que le signe "plus" +, par exemple. L'effet varie en fonction de la police et de l'espacement réellement utilisés. Sur la base des proportions de la police choisie, regroupez l'image d'entrée en blocs de pixels rectangulaires avec une largeur et une hauteur constantes (par exemple, un rectangle de 4 pixels de large et 5 pixels de haut). Chaque bloc deviendra un caractère dans la sortie. (En utilisant les blocs de pixels mentionnés ci-dessus, une image de 240w-x-320h deviendrait 64 lignes de 60 caractères.)

  2. Calculez la valeur de l'échelle de gris moyenne de chaque bloc de pixels.

  3. Pour chaque bloc de pixels, sélectionnez un caractère dont la valeur d'échelle de gris (issue de l'étape 1) est une bonne approximation de la moyenne du bloc de pixels (à partir 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 des caractères en cas de 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 caractéristique de contraste de bas à gauche vers haut à droite.

+0

pouvez-vous donner un exemple de liste de caractères dans l'ordre de l'obscurité. Peu importe quel personnage. Je veux juste dessiner des courbes de contour rapides dans le terminal. 10 serait ok, plus c'est mieux (http://stackoverflow.com/questions/15335412/rank-ascii-characters-by-intensity-darkness-lightness) –

+1

Vous auriez besoin d'expérimenter avec les polices que vous prévoyez d'utiliser, mais Voici une échelle (9 niveaux) de l'article mentionné dans un autre commentaire ci-dessous (http://www.codeproject.com/Articles/20435/Using-C-To-Generate-ASCII-Art-From-An-Image): NOIR = "@"; CHARCOAL = "#"; DARKGRAY = "8"; MEDIUMGRAY = "&"; MEDIUM = "o"; GRAY = ":"; SLATEGRAY = "*"; LIGHTGRAY = "."; WHITE = ""; Vous pouvez ajouter "W" entre "#" et "@", par exemple, mais la police utilisée par votre terminal peut nécessiter un ajustement. –

+0

@splattne Voici un [exemple simple d'approches de mine pour cette tâche en C++] (http://stackoverflow.com/a/32987834/2521214) le premier est le même que cette réponse – Spektre

15

aalib (dernière version en 2001) est une bibliothèque d'art ASCII open source qui est utilisé dans des applications comme MPlayer. Vous voudrez peut-être vérifier son code source pour voir comment il le fait. Autre que cela, this page décrit plus en détail sur la façon dont de tels algorithmes fonctionnent.

12

Aussi, vous pouvez jeter un oeil à libcaca (dernière version 2014), qui acording à leur site les améliorations suivantes par rapport aalib:

  • support Unicode
  • 2048 couleurs disponibles (certains appareils peuvent onlyhandle 16)
  • tramage des images couleur
  • opérations de toile de texte avancé (blitting, rotations)
+0

: P oui mais en ne tenant pas compte de l'icône et du nom de la bibliothèque, le code ne pue pas. et btw de ce que je sais que VLCPlayer utilise cette lib pour sa sortie ASCII. On devrait essayer de voir un film en ascii :)) il est assez amusant – daniels

+0

et aussi obtenir le flux et le rendu comme ascii de la webcam fonctionne – daniels

7

J'ai trouvé ce CodeProject article written by Daniel Fisher contenant un simple implémentation C# d'un algorithme de conversion d'image en ASCII.

Ce sont les étapes les exécute programme/bibliothèque:

  1. Chargez le flux d'images à un objet bitmap
  2. Niveaux de gris du bitmap à l'aide d'un objet Graphics
  3. boucle à travers les pixels de l'image (parce que nous don ne pas vouloir un caractère ASCII par pixel, nous 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 actuel 10 x 5.
  5. Enfin, ajoutez différents caractères ASCII basés sur le bloc en cours sur la quantité calculée.

Assez facile, n'est-ce pas?

BTW: Dans les commentaires à l'article que je trouve ce refroidissent la mise en œuvre AJAX: Gaia Ajax ASCII Art Generator:

[...] je me suis senti obligé de démontrer il pourrait facilement être fait dans un ensemble normalisé des technologies web. J'ai cherché à voir si je pouvais trouver quelques bibliothèques à utiliser, et j'ai trouvé l'article de projet de code de Sau Fan sur sa bibliothèque ASCII fying .NET .

P.S .: Lucas (voir les commentaires) trouvé une autre CodeProject article.

+0

voici un autre exemple C# dans CodeProject: http://www.codeproject.com/KB/recipes/ ASCII_Imager.aspx – Lucas

Questions connexes