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

时间:2015-05-07 10:09:00

标签: c++ sql c ascii ascii-art

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

但是,我目前很难将ASCII字符排序为亮度级别数组,然后将单个字符与像素区域匹配。

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

3 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

没有合理的方法可以做到这一点,现有的ASCII艺术程序只使用预定义的字符顺序。即char myASCII[] = " .,:ilwW";

答案 2 :(得分:0)

ASCII 字符没有内在的灰度,因为这仅取决于它们在屏幕上的绘制方式 - 字体,大小,水平和垂直间距以及颜色。

&#xA;&#xA;

仍然:可以做出有根据的猜测。对于大多数字体来说,空间是“全白”,在大多数字体中,句号将是一个小点,逗号稍大,等等。您需要的是每个可显示字符的黑白像素的比率

&#xA;&#xA;
    &#xA;
  1. 查找(或创建)您要使用的字体的位图版本,或者接近它的字体。由于大多数ASCII字体在设计上实际上非常接近,你甚至可以使用一个简单的8x8位图字体(不是很多字体的 W - 如果你找到一个,找到另一个)。当您打算将它用于ASCII艺术时,您可能只需要等宽字体。使用比例字体绘制ASCII艺术是可能的,但更难。

  2. &#xA;
  3. 遍历每个字符并计算黑色像素。通常,空格将具有 0 ,完整停止 1 ,而之类的内容将具有16个左右。 (嘿看!这是你可以使用进行循环的地方!)

  4. &#xA;
  5. 完全灰度每个字符的数字可以用 value / area 表示,其中 area 是位图的整个大小。但你对绝对价值不感兴趣!普通的ASCII范围不包含应为“全黑”的字符。要找出相对灰度,请将每个字符的值除以您为整个字体找到的最大值。这样,空格将是 0 ,“最大值”字符将是 1 ,并且所有其他字符之间将具有值。 (实际上,如果你的Space角色包含黑色像素,也可以从初始值中减去这些。只是勾勒出一般的想法;你最好不要使用这种奇怪的字体。)

  6. &#xA ;
  7. 最终将得到95个值 - 从Space(#32)到Tilde(#126)各有一个值。如果你想使用输出中的所有字符,你就可以开始了。在灰度级别对字符进行排序。对于每个灰色输入像素(从0到255的级别),将其除以255以使其与字符映射值的范围相同。然后打印最接近它的角色。 (这是最简单的方法,但可以通过各种方式进行优化。)

  8. &#xA;
  9. 如果要将灰度限制为较小的值/字符范围,使用最接近所需级别的值构建一个较小的数组。例如,如果您想要16级灰度,请找到最接近0,1 / 15,2 / 15 ... 15/15的字符。

  10. &#xA;
&# xA;&#xA;

另请参阅我对相关问题的回答的第5步和第6步。

&#XA;