代码之家  ›  专栏  ›  技术社区  ›  splattne

ASCII艺术图像转换算法是如何工作的?[关闭]

  •  54
  • splattne  · 技术社区  · 16 年前

    有一些不错的免费“图像到ASCII艺术”转换网站,如下面的网站: 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 回复  |  直到 7 年前
        1
  •  91
  •   joel.neely    16 年前

    大局层面的概念很简单:

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

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

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

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

    这是最简单的练习形式。更复杂的版本也将采用 形状 在断开像素块候选对象之间的关系时要考虑的字符数。例如,“斜线”( / )比“反斜杠”更好的选择( \ )对于具有从左下到右上对比度功能的像素块。

        2
  •  16
  •   Brian Burns Yugansh    7 年前

    aalib (2001年的最后一个版本)是一个开源的ASCII艺术库,在MPlayer等应用程序中使用。您可能想检查它的源代码,看看它是如何做到的。除此之外, this page 更详细地描述了这种算法的工作原理。

        3
  •  12
  •   Brian Burns Yugansh    7 年前

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

    • Unicode支持
    • 2048种可用颜色(某些设备只能支持16种颜色)
    • 彩色图像抖动
    • 高级文本画布操作(Blitting、Rotations)
        4
  •  7
  •   splattne    15 年前

    我发现了这个 CodeProject article written by Daniel Fisher 包含一个简单的 C实施 图像到ASCII的艺术转换算法。

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

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

    很简单,不是吗?

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

    […]我觉得有必要证明 它可以很容易地在 标准化的Web技术集。 我去看看能不能找到一些 图书馆要用,我找到了秀凡 李关于他的代码项目文章 ascii-fying.net库。

    P.S.:卢卡斯(见评论)发现了另一个 CodeProject article .

    推荐文章