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文章 。