题
有一些不错的免费“图像到 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@@@@@@@@@@:
解决方案
宏观层面的概念很简单:
每个可打印字符都可以分配一个近似的灰度值;“at”符号
@
显然在视觉上比“加号”暗+
, , 例如。效果会有所不同,具体取决于实际使用的字体和间距。根据所选字体的比例,将输入图像分组为具有恒定宽度和高度的矩形像素块(例如一个 4 像素宽、5 像素高的矩形)。每个这样的块将成为输出中的一个字符。(使用刚才提到的像素块,240w-x-320h 的图像将变成 64 行,每行 60 个字符。)
计算每个像素块的平均灰度值。
对于每个像素块,选择一个字符,其灰度值(来自步骤 1)是像素块平均值(来自步骤 3)的良好近似值。
这是最简单的练习形式。更复杂的版本也将采用实际的 形状 在打破像素块候选之间的联系时考虑字符的数量。例如,“斜杠”(/
)将是比“反斜杠”更好的选择(\
)对于看起来具有左下到右上对比特征的像素块。
其他提示
您也可以看看 libcaca
(最新版本 2014),根据他们的网站,它比 aalib
:
- 统一码支持
- 2048 种可用颜色(某些设备只能处理 16 种)
- 彩色图像的抖动
- 高级文本画布操作(位图传输、旋转)
我找到了这个 由 Daniel Fisher 撰写的 CodeProject 文章 包含一个简单的 C# 实现 图像到 ASCII 艺术转换算法的一个例子。
这些是程序/库执行的步骤:
- 将图像流加载到位图对象
- 使用 Graphics 对象对位图进行灰度化
- 循环遍历图像的像素(因为我们不希望每个像素有一个 ASCII 字符,所以我们每 10 x 5 取一个)
- 为了让每个像素影响生成的 ASCII 字符,我们循环它们并计算当前 10 x 5 块的亮度。
- 最后,根据当前块在计算出的金额上附加不同的 ASCII 字符。
很容易,不是吗?
顺便提一句:在文章的评论中我发现了这个 很酷的 AJAX 实现: Gaia Ajax ASCII 艺术生成器:
...]我被迫证明它可以轻松地在一组标准化的Web技术中进行。我着手看看是否可以找到一些库,并找到了Sau Fan Lee的Codeproject文章,内容涉及他的Ascii Fying .NET库。
附:卢卡斯(见评论)找到了另一个 代码项目文章.