Come algoritmi di conversione di immagini ASCII art funzionano? [chiuso]
Domanda
Ci sono alcuni "immagine di arte ASCII" bello libero siti di conversione come questo: ASCII-art.org
Come funziona un tale lavoro immagine algoritmo di conversione?
, . 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# @WWWWWWWWWWWWWWWWW W WW WWWWWWWWWWWWWWWWWW W WW WWWWWWWWWWWWWWWWWW@W# ,WW.WWWWWWWWWWWWWWWWWWWWW WW@WWWWWWWWWWWWWWWWWWWWW : WWWWWWWWWWWWWWWWWWWWWWWW : @ WWWWWWWW@WWWWWWW@@WWWWWW. 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@@@@@@@@@@:
Soluzione
Il concetto-di livello quadro generale è semplice:
-
Ogni carattere stampabile può essere assegnato un valore approssimativo scala di grigi; il simbolo "at"
@
ovviamente è visivamente più scuro del segno "più"+
, per esempio. L'effetto varierà, a seconda del carattere e spaziatura effettivamente utilizzato. -
In base alle proporzioni del carattere scelto, gruppo immagine di ingresso in blocchi di pixel rettangolari con larghezza costante ed altezza (ad esempio un rettangolo di 4 pixel di larghezza e 5 pixel). Ciascun tale blocco diventerà un carattere nell'output. (Usando i blocchi di pixel appena menzionati, un'immagine 240W-x-320H diventerebbe 64 righe di 60 caratteri.)
-
Calcolare il valore di grigio medio scala di ciascun blocco di pixel.
-
Per ciascun blocco di pixel, selezionare un carattere il cui valore in scala di grigi (dalla fase 1) è una buona approssimazione della media blocco di pixel (passaggio 3).
Questa è la forma più semplice di esercizio. Una versione più sofisticata anche prendere l'effettivo forme dei personaggi in considerazione quando si rompe i legami tra i candidati per un blocco di pixel. Ad esempio, un "slash" (/
) sarebbe una scelta migliore di un "barra rovesciata" (\
) per un blocco di pixel che sembra avere una funzione di contrasto basso a sinistra a in alto a destra.
Altri suggerimenti
aalib (ultima release nel 2001) è una biblioteca d'arte open source ASCII che viene usato in applicazioni come mplayer. Si consiglia di controllare il suo codice sorgente per vedere come lo fa. Oltre a questo, questa pagina descrive in modo più dettagliato su come tale lavoro algoritmi.
Inoltre è possibile dare un'occhiata a libcaca
(ultima versione 2014), che di tronchi con a il loro sito web ha i seguenti miglioramenti rispetto aalib
:
- Supporto Unicode
- 2048 colori disponibili (alcuni dispositivi possono onlyhandle 16)
- retinatura di immagini a colori
- avanzate operazioni di tela di testo (copiarlo sul video, rotazioni)
Ho trovato questo CodeProject articolo scritto da Daniel Fisher contenente un semplice C # implementazione di un immagine da algoritmo di conversione ASCII art.
Questi sono i passi del programma / libreria esegue:
- Caricare il flusso di immagini ad un oggetto bitmap
- Scala di grigio la bitmap utilizzando un oggetto Graphics
- Loop attraverso pixel dell'immagine (perché noi non vogliamo un carattere ASCII per pixel, prendiamo uno per 10 x 5)
- Per consentire a ciascun pixel influenza il carattere ASCII risultante, cappio loro e calcolare la luminosità della quantità di corrente 10 x 5 blocco.
- Infine, aggiungere diversi caratteri ASCII a base per il blocco attuale sulla quantità calcolata.
Abbastanza facile, non è vero?
A proposito: Nei commenti all'articolo ho trovato questo raffreddare AJAX realizzazione : Gaia Ajax ASCII Art Generator :
[...] mi sono sentito in dovere di dimostrare potrebbe essere facilmente fatto in un insieme standardizzato di tecnologie web. Ho deciso di vedere se riuscivo a trovare un po ' librerie da usare, e ho trovato Sau Fan articolo CodeProject di Lee sulla sua biblioteca ASCII fying NET.
PS:. Lucas (vedi commenti) ha trovato un altro CodeProject articolo