2015-05-07 34 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的相關問題。