2015-05-07 33 views
0

我正在研究一个程序(用C/C++),其中用户应该选取用户选择的图像并将其转换为ASCII艺术(使用SQL )。到目前为止,我已经能够让用户选择一个图像并以灰度显示这个图像在一个窗口中。ASCII艺术 - 按照亮度级别对ASCII字符数组进行排序(C/C++)

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

我知道我需要使用'for'循环,但到目前为止我找不到任何有用的东西。谢谢:D

+0

你应该添加一些你的代码,这样我们就可以看到你已经有了什么以及确切的问题。 – Wouter

+0

问题是我不知道如何分析像素组并将它们匹配到相同“亮度”的ASCII字符。 – INeedHelp

+0

请参阅[jp2a](https://csl.name/jp2a/) –

回答

0

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

0

ASCII字符有没有内在的灰暗,因为这不仅取决于它们是如何得出你的屏幕上 - 什么字体,大小,以及水平和垂直间距,以及在什么颜色。

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

  1. 查找(或创建)您要使用的字体的位图版本,或者一个靠近它的字体。由于大多数ASCII字体实际上在设计上非常接近,所以甚至可以使用简单的8x8位图字体(并非很多字体的!比“W重”) - 如果找到其中一个,找到另一个)。正如你将要使用它的ASCII艺术,你可能只需要等宽字体。用比例字体绘制ASCII艺术是可能的,但要困难得多。

  2. 在每个字符上循环并计算黑色像素。通常情况下,一个空间将有0,一个句号1,而类似#的东西将有16个左右。 (嘿,快看!这就是你可以使用for循环!)

  3. 每个字符的准确灰暗可以通过value/area其中area是位图的整个尺寸来表示。但你对绝对值不感兴趣!正常的ASCII范围不包含应该是“全黑”的字符。要找出相对于的灰度,请将每个字符的值除以整个字体找到的最大值。这样,空间将是0,“最大值”字符将是1,并且所有其他字符之间将有一个值。 (事实上​​,如果你的空格字符包含黑色像素,减去这些从初始值也只是勾勒出总体思路;你最好不要使用这样一个奇怪的字体。)

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

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

请参阅my answer的步骤5和步骤6的相关问题。