2015-05-07 2 views
0

Я работаю над программой (на C/C++), где пользователь должен выбрать выбранный пользователем образ и преобразовать его в искусство ASCII (используя SQL). До сих пор я смог пользователю выбрать изображение и отобразить это изображение в оттенках серого в окне.ASCII Art - Сортировка массива символов ASCII по уровням яркости (C/C++)

Однако в настоящее время у меня возникают трудности с сортировкой символов ASCII в виде массива уровней яркости, а затем сопоставление одного символа с областью пикселей.

Я знаю, что мне нужно будет использовать циклы «для», но пока я не могу найти что-либо полезное в Интернете. Спасибо: D

+0

Вы должны добавить часть своего кода, чтобы мы могли видеть, что у вас есть, и где находится точная проблема. – Wouter

+0

Проблема в том, что я понятия не имею, как анализировать группы пикселей и сопоставлять их с символом ASCII той же «яркости». – INeedHelp

+0

См. [Jp2a] (https://csl.name/jp2a/) –

ответ

0

Нет разумного способа сделать это, и существующие программы ASCII-art просто используют предопределенный порядок символов. То есть char myASCII[] = " .,:ilwW";

0

ASCII символы не имеют никакой внутренней серости, потому что это зависит только от того, как они нарисованы на экране - в какой шрифт, размер и горизонтального и вертикального расстояния, и в какие цвета.

По-прежнему: можно сделать обоснованное предположение. Пространство «все белое» для большинства шрифтов, полная остановка будет маленькой точкой в ​​большинстве шрифтов, запятая немного больше и т. Д. Все, что вам нужно, это соотношение черно-белых пикселей для каждого отображаемого символа.

  1. Найти (или создать) растровую версию шрифта, который вы собираетесь использовать, или близкого к нему. Поскольку большинство шрифтов ASCII на самом деле очень близки по своему дизайну, вы даже можете использовать простой шрифт 8x8 bitmap (не многие шрифты будут иметь !, который «тяжелее», чем W - если вы найдете тот, который делает, найдите другой). Поскольку вы собираетесь использовать его для искусства ASCII, вы, вероятно, хотите только моноширинные шрифты. Рисование искусства ASCII с пропорциональными шрифтами возможно, но намного сложнее.

  2. Петля над каждым символом и подсчет черных пикселей. Как правило, пространство будет иметь 0, полную остановку 1, и что-то вроде # будет иметь 16 или около того. (Эй, смотри! Здесь вы можете использовать for цикл!)

  3. точное серости каждого символа может быть представлен value/area где area является весь размер растрового изображения. Но вас не интересует абсолютная ценность! Нормальный диапазон ASCII не содержит символ, который должен быть «черным». Чтобы узнать родственник серость, разделите значение для каждого символа на максимум значение, которое вы нашли для всего шрифта. Таким образом, пространство будет 0, символ «максимального значения» будет 1, а все остальные символы будут иметь значение между ними. (На самом деле, если ваш Символ пространства содержит черные пиксели, вычтите их также из начальных значений. Чтобы описать общую идею, лучше не использовать такой странный шрифт.)

  4. В итоге вы получите 95 значения - по одному для каждого из Space (# 32) в Tilde (# 126). Если вы хотите использовать все символы в своем выходе, вы готовы к работе. Сортировка символов на их сером уровне. Для каждого серого входного пикселя (уровень от 0 до 255) разделите его на 255, чтобы получить его в том же диапазоне, что и значение символьной карты. Затем напечатайте символ с ближайшим к нему уровнем. (Это самый простой метод, но его можно оптимизировать по-разному.)

  5. Если вы хотите ограничить оттенки серого меньшим диапазоном значений/символов, создайте меньший массив со значениями, наиболее близкими к требуемым уровням. Например, если вы хотите 16 уровней серого, найдите символы, наиболее близкие к 0, 1/15, 2/15 ... 15/15.

См. Также Шаг 5 и 6 из my answer к соответствующему вопросу.

Смежные вопросы