Как работают алгоритмы преобразования изображений ASCII art? [закрытый]

есть некоторые хорошие бесплатные сайты преобразования "изображение в ASCII art", такие как этот:ASCII-art.org

Как работает такой алгоритм преобразования изображений?

                         ,                     
                     .   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@@@@@@@@@@:

4 ответов


концепция уровня большого изображения проста:

  1. каждому печатаемому символу может быть присвоено приблизительное значение серой шкалы; знак "at"@ очевидно, визуально темнее, чем знак "плюс"+, например. Эффект будет варьироваться в зависимости от используемого шрифта и интервала.

  2. на основе пропорций выбранного шрифта сгруппируйте входное изображение в прямоугольные пиксельные блоки с постоянной шириной и высотой (например, a прямоугольник шириной 4 пикселя и высотой 5 пикселей). Каждый такой блок станет одним символом на выходе. (Используя только что упомянутые пиксельные блоки, изображение 240w-x-320h станет 64 строками из 60 символов.)

  3. вычислить среднее значение шкалы серого для каждого пиксельного блока.

  4. для каждого пиксельного блока Выберите символ, значение серого масштаба которого (из Шага 1) является хорошим приближением среднего пиксельного блока (из шага 3).

это самая простая форма упражнения. Более сложная версия также будет принимать фактические формы символов, учитываемых при разрыве связей между кандидатами на пиксельный блок. Например, "Слэш" (/) будет лучшим выбором, чем "обратная косая черта" (\) для пиксельного блока, который, как представляется, имеет функцию контраста снизу слева вверх справа.


aalib (последняя версия в 2001 году) - это художественная библиотека ASCII с открытым исходным кодом, используемая в таких приложениях, как mplayer. Вы можете проверить его исходный код, чтобы увидеть, как он это делает. Кроме этого, на этой странице более подробно описывает, как работают такие алгоритмы.


Также вы можете посмотреть libcaca (последний выпуск 2014), который согласно их веб-сайту имеет следующие улучшения по сравнению с aalib:

  • поддержка Unicode
  • 2048 доступных цветов (некоторые устройства могут onlyhandle 16)
  • сглаживание цветных изображений
  • расширенные операции текстового холста (blitting, вращения)

Я нашел это статья CodeProject, написанная Даниэлем Фишером содержащие простые реализация c# алгоритма преобразования изображения в ASCII art.

вот шаги, которые выполняет программа/библиотека:

  1. загрузите поток изображений в растровый объект
  2. оттенки серого растровое изображение с помощью графического объекта
  3. цикл через пиксели изображения (потому что мы не хотим один символ ASCII на пиксель, мы берем один на 10 x 5)
  4. чтобы каждый пиксель влиял на результирующий ASCII-символ, мы зацикливаем их и вычисляем яркость текущего блока 10 x 5.
  5. наконец, добавьте различные символы ASCII на основе текущего блока на вычисленную сумму.

довольно легко, не так ли?

BTW: в комментариях к статье я нашел это классная реализация AJAX: Gaia Ajax ASCII Art Генератор:

[...] Я чувствовал себя обязанным продемонстрировать это можно легко сделать в стандартный набор веб-технологий. Я отправился посмотреть, не найду ли я что-нибудь. библиотеки для использования, и я нашел sau Fan Статья ли в codeproject о его ASCII fying .NET библиотека.

С. П.: Лукас (см. комментарии) нашли другое статья CodeProject.