62

有一些不错的免费“图像到 ASCII 艺术”转换网站,例如:ASCII-art.org

这样的图像转换算法是如何工作的?

                         ,                     
                     . ,                
                     万维网@                
                     ,WW                
                  , W, :W* .W 。             
                  #WW@WWWW#             
                  万维网万维网:W             
                  W.WW*WWW#WW@W             
               * :WW.WWWWWWW@WWW@W #          
              +* #WW#WWWWWWWWWWWWWW# W          
              W# @WWWWWWWWWWWWWWWWW          
              万维网万维网万维网万维网万维网          
              万维网万维网万维网万维网@W#         
             ,WW.WWWWWWWWWWWWWWWWWWWW         
              WW@WWWWWWWWWWWWWWWWWWWW         
            : WWWWWWWWWWWWWWWWWWWWWWW :       
            @WWWWWWW@WWWWWWW@@WWWWWW。        
            W*WWWWWW::::@WWW:::::#WWWW        
            万维网@:::+*:. ::@WWWW        
            WWWWW@:*:.:: .,.:.:WWWW        
            @WWWW#:.::::. .:: #:@WWW        
            :万维网@:#。:: :WWWW:@WWWW        
             万维网#*:W@*@W 。:#WWW        
            #WWWW:@ :: :: *WWWW        
            W@WW*W .::,.::::,:+ @@WW#,       
            WWWW## ,,.: .:::.: . 。万维网:,       
            @WWW@: W..::::: #. :万维网        
             万维网:: *..:. ::.,. :万维网        
             WWWW:::.:.::::,@WW@        
             万维网: .:, : ,, :WW,        
             .: # : , : *         
              W + ., ::: ., : @         
              W :: .: W         
           @,,,W:。,, ::*@*:, . :@W.,,@      
         +.....*: : : .#WWWWW: : .#:....+,    
        @...:::*:,, ::WWWWWWW, , *::::..,#   
      :...::::::W:, @W::::*W。:W:::::...#  
     @@@@@@@@@@@W@@@@@W@@@@@@W@@@@@W@@@@@@@@@@:

4

4 回答 4

105

大图级别的概念很简单:

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

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

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

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

这是最简单的练习形式。更复杂的版本在打破像素块候选者之间的联系时也会考虑字符的实际形状。例如,对于看起来具有从左下角到右上角对比度特征的像素块, “斜线”( /) 比“反斜线” ( ) 是更好的选择。\

于 2008-12-27T16:04:00.150 回答
20

aalib(最后一次发布于 2001 年)是一个开源 ASCII 艺术库,用于 mplayer 等应用程序。您可能想查看它的源代码以了解它是如何工作的。除此之外,本页更详细地描述了此类算法的工作原理。

于 2008-12-27T11:05:57.897 回答
14

您还可以查看libcaca(2014 年最新版本),根据他们的网站,它有以下改进aalib

  • Unicode 支持
  • 2048 种可用颜色(某些设备只能处理 16 种)
  • 彩色图像的抖动
  • 高级文本画布操作(位图、旋转)
于 2008-12-27T12:04:03.177 回答
8

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

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

  1. 将图像流加载到位图对象
  2. 使用 Graphics 对象对位图进行灰度化
  3. 循环遍历图像的像素(因为我们不希望每个像素有一个 ASCII 字符,我们每 10 x 5 取一个)
  4. 为了让每个像素影响生成的 ASCII 字符,我们循环它们并计算当前 10 x 5 块的亮度。
  5. 最后,根据计算的数量为当前块附加不同的 ASCII 字符。

很容易,不是吗?

顺便说一句:在文章的评论中,我发现了这个很酷的 AJAX 实现Gaia Ajax ASCII Art Generator

[...] 我觉得有必要证明它可以在一组标准化的网络技术中轻松完成。我开始寻找是否可以找到一些库来使用,我找到了 Sau Fan Lee 的 codeproject 文章,其中介绍了他的 ASCII fying .NET 库。

PS:卢卡斯(见评论)找到另一篇 CodeProject 文章

于 2008-12-27T16:00:43.183 回答