有一些不错的免费“图像到 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@@@@@@@@@@:

有帮助吗?

解决方案

宏观层面的概念很简单:

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

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

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

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

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

其他提示

的aalib (在2001年的最后一个版本)是所使用的开放源码ASCII技术库像mplayer的应用。你可能想看看它的源代码,看看它是怎么做的。除此之外,此页面更加详细地介绍有关算法如何工作等。

您也可以看看 libcaca (最新版本 2014),根据他们的网站,它比 aalib:

  • 统一码支持
  • 2048 种可用颜色(某些设备只能处理 16 种)
  • 彩色图像的抖动
  • 高级文本画布操作(位图传输、旋转)

我找到了这个 由 Daniel Fisher 撰写的 CodeProject 文章 包含一个简单的 C# 实现 图像到 ASCII 艺术转换算法的一个例子。

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

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

很容易,不是吗?

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

...]我被迫证明它可以轻松地在一组标准化的Web技术中进行。我着手看看是否可以找到一些库,并找到了Sau Fan Lee的Codeproject文章,内容涉及他的Ascii Fying .NET库。

附:卢卡斯(见评论)找到了另一个 代码项目文章.

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top