有一些很好的免费"图像到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@@@@@@@@@@:
joel.neely.. 94
大画面概念很简单:
可以为每个可打印字符分配近似的灰度值; 例如,"at"符号@
在视觉上明显比"plus"符号更暗+
.效果会有所不同,具体取决于实际使用的字体和间距.
根据所选字体的比例,将输入图像分组为具有恒定宽度和高度的矩形像素块(例如,矩形4像素宽,5像素高).每个这样的块将成为输出中的一个字符.(使用刚刚提到的像素块,240w-x-320h图像将变为64行,每行60个字符.)
计算每个像素块的平均灰度值.
对于每个像素块,选择一个字符,其灰度值(来自步骤1)是像素块平均值的良好近似值(来自步骤3).
这是最简单的练习形式.更复杂的版本还将在打破像素块的候选者之间的关系时考虑角色的实际形状.例如,对于看起来具有从左下到右上对比度特征的像素块,"斜杠"(/
)对于"反斜杠"()是更好的选择\
.
大画面概念很简单:
可以为每个可打印字符分配近似的灰度值; 例如,"at"符号@
在视觉上明显比"plus"符号更暗+
.效果会有所不同,具体取决于实际使用的字体和间距.
根据所选字体的比例,将输入图像分组为具有恒定宽度和高度的矩形像素块(例如,矩形4像素宽,5像素高).每个这样的块将成为输出中的一个字符.(使用刚刚提到的像素块,240w-x-320h图像将变为64行,每行60个字符.)
计算每个像素块的平均灰度值.
对于每个像素块,选择一个字符,其灰度值(来自步骤1)是像素块平均值的良好近似值(来自步骤3).
这是最简单的练习形式.更复杂的版本还将在打破像素块的候选者之间的关系时考虑角色的实际形状.例如,对于看起来具有从左下到右上对比度特征的像素块,"斜杠"(/
)对于"反斜杠"()是更好的选择\
.
aalib(2001年最新发布)是一个开源的ASCII艺术库,用于mplayer等应用程序.您可能想查看其源代码,看看它是如何做到的.除此之外,本页面更详细地描述了这些算法的工作原理.
您还可以查看libcaca
(2014年最新版本),根据他们的网站对其进行了以下改进aalib
:
Unicode支持
2048种可用颜色(某些设备只能处理16种颜色)
抖动彩色图像
高级文本画布操作(blitting,rotation)
我发现这篇由Daniel Fisher编写的CodeProject文章包含了一个简单的C#实现图像到ASCII艺术转换算法.
这些是程序/库执行的步骤:
将Image流加载到位图对象
使用Graphics对象对位图进行灰度化
循环遍历图像的像素(因为我们不希望每个像素有一个ASCII字符,我们每10 x 5需要一个)
为了让每个像素影响生成的ASCII字符,我们循环它们并计算当前10 x 5块的亮度.
最后,根据计算量的当前块附加不同的ASCII字符.
很简单,不是吗?
顺便说一句:在文章的评论中,我发现了这个很酷的AJAX实现:Gaia Ajax ASCII Art Generator:
[...]我觉得有必要证明它可以很容易地在一套标准化的网络技术中完成.我开始着手查看是否可以找到一些库,我找到了Sau Fan Lee的代码项目文章,关于他的ASCII文件.NET库.
PS:Lucas(见评论)发现了另一篇CodeProject文章.