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

63
有一些很好的免费的“图像转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
在.NET中生成ASCII横幅,请查看https://github.com/drewnoakes/figgle - Drew Noakes
4个回答

106

总体概念很简单:

  1. 每个可打印字符可以被赋予一个近似的灰度值;例如,“at”符号@明显比“加号”符号+更暗。其效果将取决于实际使用的字体和间距。

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

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

  4. 对于每个像素块,选择一个灰度值(来自步骤1)与像素块平均值(来自步骤3)的差异较小的字符。

这是该练习的最简形式。一个更复杂的版本还将考虑字符的实际形状,以便在候选像素块之间进行抉择。例如,在出现从左下到右上的对比特征的像素块中,“/”符号将优于“\”符号。


你能否提供一个按照暗度顺序排列的字符样本列表。无论哪个字符都可以。我只是想在终端中快速绘制轮廓图。10个足够了,更多更好。(http://stackoverflow.com/questions/15335412/rank-ascii-characters-by-intensity-darkness-lightness) - kirill_igum
1
你需要尝试使用计划中的字体,但是以下是另一条评论中提到的文章(http://www.codeproject.com/Articles/20435/Using-C-To-Generate-ASCII-Art-From-An-Image)中的(9级)比例尺:BLACK =“@”; CHARCOAL =“#”; DARKGRAY =“8”; MEDIUMGRAY =“&”; MEDIUM =“o”; GRAY =“:”; SLATEGRAY =“*”; LIGHTGRAY =“。”; WHITE =“ ”;例如,在“#”和“@”之间添加“W”,但实际终端使用的字体可能需要调整。 - joel.neely
@splattne 这里是我用C ++完成此任务的一个简单示例,第一个示例与此答案相同。 - Spektre
2
谢谢你的解释!注意,我根据你的详细帖子写了一篇详细的教程:https://www.jonathan-petitcolas.com/2017/12/28/converting-image-to-ascii-art.html :) - Jonathan Petitcolas

20

aalib(2001年发布的最新版本)是一个开源的ASCII艺术库,被应用于像mplayer这样的应用程序中。您可能希望查看其源代码以了解其工作原理。除此之外,此页面更详细地描述了这些算法的工作原理。


14

另外,您也可以查看libcaca(最新版本发布于2014年),据他们的网站介绍,它比aalib有以下改进:

  • 支持 Unicode
  • 支持2048种颜色(某些设备只能处理16种)
  • 对彩色图像进行抖动处理
  • 高级文本画布操作(blitting、旋转)

是的,但不考虑图标和库的名称,代码并不糟糕。顺便说一句,据我所知,VLCPlayer使用此库进行其ASCII输出。应该尝试在ASCII中观看电影:))这非常有趣。 - daniels
从网络摄像头获取视频并将其渲染为ASCII字符的操作已经实现。 - daniels

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

[...] 我感到有必要证明它可以在一组标准的Web技术中轻松完成。我开始寻找可用的库,并找到了Sau Fan Lee的CodeProject文章,介绍了他的.NET ASCII转换库。

P.S .:Lucas(见评论)发现另一篇 CodeProject文章


这是CodeProject中另一个C#示例:http://www.codeproject.com/KB/recipes/ASCII_Imager.aspx - Lucas

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接