ASCII艺术图像转换algorithm如何工作?
有一些很好的免费的“ASCII艺术”转换网站像这样的: ASCII-art.org
这种图像转换algorithm如何工作?
, 。 W, WW @ W,WW,W,:W * .W。 #WW @WW WW# W WW.WWW WW:W W. WW * WWW#WW @ W *:WW.WWWWWWW @ WWW @ W# + *#WW#WWWWWWWWWWWWW#WW#@WWWWWWWWWWWWWWWWWWWWWW 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 :万维网@:#。 :::WWWW:@WWWW WWW#*:W @ * @ W。 女:#WWW #WWWW:@ :: :: * WWWW W @ WW * W。::,。::::,:+ @@ WW#, WWWW ##,。:。:::。:。 。万维网:, @ WWW @:W .. :::::# :WWWW WWWW :: * ..:。 ::,。 :WWWW WWWW :::。:。:::,@ WW @ WWWW:。:,::WW, 。:#:,:* W +。,:::。,:@ W ::。:W @ ,,, w ^ :. ,, :: * @ *:,。 :@W ,, @ + ..... *::。。#WWWWW::。#:.... +, @ ... ::: *:,,:::WWWWWWW,* :::: ..,# :... :::::: W:,@W :::: * W。 :W ::::: ...# @@@@@@@@@@@ w ^ w ^ @@@@@ @@@@@@ w ^ w ^ @@@@@ @@@@@@@@@@:
大画面的概念很简单:
-
每个可打印的字符可以分配一个近似的灰度值; 例如,“at”符号显然在视觉上比“plus”符号
+
更暗。 效果会有所不同,具体取决于实际使用的字体和间距。 -
基于所选字体的比例,将input图像分组为具有恒定宽度和高度的矩形像素块(例如,4像素宽和5像素高的矩形)。 每个这样的块将成为输出中的一个字符。 (使用刚刚提到的像素块,240w-x-320h图像将变为60行的64行)。
-
计算每个像素块的平均灰度值。
-
对于每个像素块,select其灰度值(来自步骤1)是像素块平均的良好近似的字符(来自步骤3)。
这是演习的最简单forms。 一个更复杂的版本也将考虑到一个像素块的候选人之间的联系时,考虑到字符的实际形状 。 例如,像素块的“斜杠”( /
)将比“反斜杠”( \
)更好,该像素块似乎具有左下angular到右上angular的对比度特征。
aalib (2001年的最后一个版本)是一个开源的ASCII艺术库,用于像mplayer这样的应用程序。 你可能想看看它的源代码,看看它是如何做到的。 除此之外, 这个页面更详细地描述了这些algorithm是如何工作的。
你也可以看看libcaca
(最新发布2014),根据他们的网站对aalib
有以下改进:
- Unicode支持
- 2048个可用的颜色(有些设备只能处理16个)
- 抖动彩色图像
- 高级文本canvas操作(blitting,旋转)
我发现这个由Daniel Fisher编写的CodeProject文章包含一个简单的C#实现图像到ASCII艺术转换algorithm。
这些是程序/库执行的步骤:
- 将图像stream加载到位图对象
- 使用Graphics对象灰度化位图
- 循环显示图像的像素(因为我们不需要每个像素有一个ASCII字符,所以我们每10 x 5取一个ASCII字符)
- 为了让每个像素都影响结果的ASCII字符,我们循环它们并计算当前10 x 5块的亮度。
- 最后,在计算的数量上附加基于当前块的不同ASCII字符。
很简单,不是吗?
顺便说一句:在文章的评论中,我发现这个很酷的AJAX实现 : Gaia Ajax ASCII艺术生成器 :
我感到不得不performance出一套标准化的networking技术。 我着手研究是否可以find一些库,我find了Sau Fan Lee的codeproject文章,介绍了他的ASCII码库。
PS:卢卡斯(见评论)发现另一个CodeProject文章 。