ASCII Art - 按亮度级别对 ASCII 字符数组进行排序 (C/C++)

INe*_*elp 7 c c++ sql ascii ascii-art

我正在开发一个程序(C/C++),用户应该获取用户选择的图像并将其转换为 ASCII 艺术(使用 SQL)。到目前为止,我已经能够让用户选择图像并在窗口中以灰度显示该图像。

然而,我目前在将 ASCII 字符排序为亮度级别数组,然后将单个字符与像素区域匹配时遇到困难。

我知道我需要使用“for”循环,但到目前为止我在互联网上找不到任何有用的东西。谢谢你:D

Ahs*_*han 20

$@B%8&WM#*oahkbdpqwmZO0QLCJUYXzcvunxrjft/\|()1{}[]?-_+~<>i!lI;:,"^`'.
Run Code Online (Sandbox Code Playgroud)

这是从暗到亮的标准灰度(或者相反,具体取决于您喜欢的显示颜色。)


小智 10

 `.-':_,^=;><+!rc*/z?sLTv)J7(|Fi{C}fI31tlu[neoZ5Yxjya]2ESwqkP6h9d4VpOGbUAKXHm8RD#$Bg0MNWQ%&@
Run Code Online (Sandbox Code Playgroud)

我发现 Ahsen Khan 的答案对于我的 Windows 控制台字体 (consolas) 来说并不完全准确,它产生的结果略有偏差。我编写了一个程序,通过对每个像素的灰度值求和来分析和排序字符,从而产生了这个结果。不要忘记在开头添加空格。

字符在黑暗中的分布也不均匀(尽管我发现假设均匀分布的结果很好)。每个角色的黑暗度为:

[0, 0.0751, 0.0829, 0.0848, 0.1227, 0.1403, 0.1559, 0.185, 0.2183, 0.2417, 0.2571, 0.2852, 0.2902, 0.2919, 0.3099, 0.3192, 0.3232, 0.3294, 0.3384, 0.3609, 0.3619, 0.3667, 0.3737, 0.3747, 0.3838, 0.3921, 0.396, 0.3984, 0.3993, 0.4075, 0.4091, 0.4101, 0.42, 0.423, 0.4247, 0.4274, 0.4293, 0.4328, 0.4382, 0.4385, 0.442, 0.4473, 0.4477, 0.4503, 0.4562, 0.458, 0.461, 0.4638, 0.4667, 0.4686, 0.4693, 0.4703, 0.4833, 0.4881, 0.4944, 0.4953, 0.4992, 0.5509, 0.5567, 0.5569, 0.5591, 0.5602, 0.5602, 0.565, 0.5776, 0.5777, 0.5818, 0.587, 0.5972, 0.5999, 0.6043, 0.6049, 0.6093, 0.6099, 0.6465, 0.6561, 0.6595, 0.6631, 0.6714, 0.6759, 0.6809, 0.6816, 0.6925, 0.7039, 0.7086, 0.7235, 0.7302, 0.7332, 0.7602, 0.7834, 0.8037, 0.9999]
Run Code Online (Sandbox Code Playgroud)

这些值按比例缩放,0 表示全黑色像素(即空格字符),0.9999 表示最亮(“@”)。

  • 好答案!它的渐变也更长,这很好。感谢您提供更好的答案,我自己肯定会使用它。 (2认同)

MSa*_*ers 1

没有合理的方法可以做到这一点,并且现有的 ASCII-art 程序仅使用预定义的字符顺序。IEchar myASCII[] = " .,:ilwW";