Como fazer ASCII algoritmos de conversão de imagem do trabalho de arte? [fechadas]
Pergunta
Há alguns "imagem para arte ASCII" agradável livre sites de conversão como este: ASCII-art.org
Como é que tal trabalho algoritmo de conversão de imagem?
, . 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@@@@@@@@@@:
Solução
O conceito-imagem de nível grande é simples:
-
Cada personagem impressão pode ser atribuído um valor aproximado de escala de cinza; o "at"
@
sinal, obviamente, é visualmente mais escura do que o "plus"+
sinal, por exemplo. O efeito pode variar, dependendo da fonte e espaçamento realmente utilizados. -
Com base nas proporções da fonte escolhida, grupo a imagem de entrada em blocos de peis rectangulares com largura e altura constante (por exemplo, um rectângulo de 4 pixels de largura e 5 pixels de altura). Cada um desses blocos se tornará um personagem na saída. (Usando os blocos de pixels que acabamos de mencionar, uma imagem de 240w-x-320H seria 64 linhas de 60 caracteres.)
-
Calcule o valor médio de escala de cinza de cada bloco de pixels.
-
Para cada bloco de pixels, selecione um personagem cujo valor de escala de cinza (do passo 1) é uma boa aproximação da média bloco de pixels (a partir do passo 3).
Essa é a forma mais simples do exercício. Uma versão mais sofisticada também levará o real formas dos personagens em conta quando quebrar os laços entre os candidatos para um bloco de pixel. Por exemplo, uma "barra" (/
) seria uma escolha melhor do que uma "barra invertida" (\
) para um bloco de pixels que parece ter uma característica contraste da esquerda para a superior direito-inferior.
Outras dicas
aalib (último lançamento em 2001) é uma biblioteca de arte open source ASCII que é usado em aplicações como o MPlayer. Você pode querer verificar o seu código fonte para ver como ele faz isso. Fora isso, desta página descreve com mais detalhes sobre como esses algoritmos de trabalho.
Além disso, você pode dar uma olhada em libcaca
(última versão de 2014), que monitores segundo a seu site tem as seguintes melhorias ao longo aalib
:
- Suporte Unicode
- 2048 cores disponíveis (alguns dispositivos podem onlyhandle 16)
- pontilhamento de imagens coloridas
- operações avançadas de lona de texto (blitting, rotações)
Eu encontrei este href="http://www.codeproject.com/KB/web-image/ascii_art_with_c_.aspx" rel="noreferrer"> artigo contendo uma simples C # implementação de um algoritmo de conversão de arte para ASCII.
Estas são as etapas o programa / executa biblioteca:
- Coloque o fluxo de imagem a um objeto bitmap
- Grayscale o bitmap usando um objeto Graphics
- Percorre os pixels da imagem (porque não queremos um caractere ASCII por pixel, tomamos um por 10 x 5)
- Para permitir que cada pixel influenciar o caractere ASCII resultante, nós laço-los e calcular o brilho do valor da corrente 10 x 5 bloco.
- Finalmente, acrescentar diferentes caracteres ASCII base para o bloco atual no valor calculado.
Muito fácil, não é?
BTW: Nos comentários ao artigo que encontrei este arrefecer implementação AJAX : Gaia Ajax ASCII Art Generator :
[...] Eu me senti compelido a demonstrar que poderia ser feito facilmente em um padronizado conjunto de tecnologias web. Eu definidos para ver se eu poderia encontrar alguma bibliotecas de usar, e eu achei Sau Fan artigo codeproject de Lee sobre sua ASCII biblioteca fying NET.
PS: Lucas (ver comentários) encontrou outro CodeProject artigo