ASCII艺术图像转换algorithm如何工作?

有一些很好的免费的“ASCII艺术”转换网站像这样的: ASCII-art.org

这种图像转换algorithm如何工作?

                          ,                     
                      。  W,                
                      WW @                
                      W,WW,W,:W * .W。             
                   #WW @WW WW#             
                   W WW.WWW WW:W             
                   W. WW * WWW#WW @ W             
                *:WW.WWWWWWW @ WWW @ W#          
               + *#WW#WWWWWWWWWWWWW#WW#@WWWWWWWWWWWWWWWWWWWWWW 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        
             :万维网@:#。  :::WWWW:@WWWW        
              WWW#*:W @ * @ W。 女:#WWW        
             #WWWW:@ :: :: * WWWW        
             W @ WW * W。::,。::::,:+ @@ WW#,       
             WWWW ##,。:。:::。:。  。万维网:,       
             @ WWW @:W .. :::::#  :WWWW        
              WWWW :: * ..:。  ::,。  :WWWW        
              WWWW :::。:。:::,@ WW @        
              WWWW:。:,::WW,        
              。:#:,:*         
               W +。,:::。,:@         
               W ::。:W         
            @ ,,, w ^ :.  ,, :: * @ *:,。  :@W ,, @      
          + ..... *::。。#WWWWW::。#:.... +,    
         @ ... ::: *:,,:::WWWWWWW,* :::: ..,#   
       :... :::::: W:,@W :::: * W。  :W ::::: ...#  
      @@@@@@@@@@@ w ^ w ^ @@@@@ @@@@@@ w ^ w ^ @@@@@ @@@@@@@@@@:

大画面的概念很简单:

  1. 每个可打印的字符可以分配一个近似的灰度值; 例如,“at”符号显然在视觉上比“plus”符号+更暗。 效果会有所不同,具体取决于实际使用的字体和间距。

  2. 基于所选字体的比例,将input图像分组为具有恒定宽度和高度的矩形像素块(例如,4像素宽和5像素高的矩形)。 每个这样的块将成为输出中的一个字符。 (使用刚刚提到的像素块,240w-x-320h图像将变为60行的64行)。

  3. 计算每个像素块的平均灰度值。

  4. 对于每个像素块,select其灰度值(来自步骤1)是像素块平均的良好近似的字符(来自步骤3)。

这是演习的最简单forms。 一个更复杂的版本也将考虑到一个像素块的候选人之间的联系时,考虑到字符的实际形状 。 例如,像素块的“斜杠”( / )将比“反斜杠”( \ )更好,该像素块似乎具有左下angular到右上angular的对比度特征。

aalib (2001年的最后一个版本)是一个开源的ASCII艺术库,用于像mplayer这样的应用程序。 你可能想看看它的源代码,看看它是如何做到的。 除此之外, 这个页面更详细地描述了这些algorithm是如何工作的。

你也可以看看libcaca (最新发布2014),根据他们的网站对aalib有以下改进:

  • Unicode支持
  • 2048个可用的颜色(有些设备只能处理16个)
  • 抖动彩色图像
  • 高级文本canvas操作(blitting,旋转)

我发现这个由Daniel Fisher编写的CodeProject文章包含一个简单的C#实现图像到ASCII艺术转换algorithm。

这些是程序/库执行的步骤:

  1. 将图像stream加载到位图对象
  2. 使用Graphics对象灰度化位图
  3. 循环显示图像的像素(因为我们不需要每个像素有一个ASCII字符,所以我们每10 x 5取一个ASCII字符)
  4. 为了让每个像素都影响结果的ASCII字符,我们循环它们并计算当前10 x 5块的亮度。
  5. 最后,在计算的数量上附加基于当前块的不同ASCII字符。

很简单,不是吗?

顺便说一句:在文章的评论中,我发现这个很酷的AJAX实现 : Gaia Ajax ASCII艺术生成器 :

我感到不得不performance出一套标准化的networking技术。 我着手研究是否可以find一些库,我find了Sau Fan Lee的codeproject文章,介绍了他的ASCII码库。

PS:卢卡斯(见评论)发现另一个CodeProject文章 。