Когда вы говорите
, сравнивайте каждый раздел с подмножеством Unicode
, это не совсем понятно, потому что есть несколько способов сделать это.Я бы довел сравнение до уровня пикселей.В сером изображении каждый пиксель имеет значение серого.Предположим, что вы хотите заменить каждый пиксель соответствующим символом. Как имеет этот символ для соответствия пикселю ?Если вы посмотрите на персонажа очень далеко, вы увидите только серое пятно.Если вы замените пиксель символом, вам следует выбрать символ с максимально похожим значением серого для этого пикселя.
В моноширинном шрифте каждый символ использует одинаковое количество места.Если вы возьмете этот прямоугольник пространства и нарисуете на нем символ, вы можете вычислить среднее значение серого .Это среднее значение серого не больше, чем площадь прямоугольника белого цвета по сравнению со всем прямоугольником. пробел имеет значение серого 1. И, возможно, знак доллара является одним из самых черных символов, которые вы найдете.
Итак, вот что я бы сделал:
- Берите набор символов, независимо от того, используете ли вы только ascii или uni-код.Рассчитайте для каждого персонажа количество белого.Должно быть очевидно, что это может отличаться для разных шрифтов, но вы должны использовать моноширинный.
- Теперь у вас есть список, который отображает каждый символ в значение серого.Теперь вы должны изменить масштаб значений серого до целевого интервала значений серого.Если у вас есть 8-битное изображение, то ваш самый яркий символ (пробел) должен соответствовать значению 255, а ваш самый темный должен соответствовать уровню серого 0.
- Теперь измените масштаб входного изображения, чтобы ононе слишком большой, потому что даже с очень маленьким шрифтом вы, возможно, не получите 2000 символов в одной строке.
- Замените каждый пиксель символом, уровень серого которого ближе всего к его собственному уровню серого
В Mathematica это всего лишь несколько строк кода.В Python это может быть немного длиннее, но это тоже должно быть хорошо.
Используя этот способ, вы получите довольно удивительные результаты, когда смотрите на текст издалека и когда вы приближаетесьВы видите, что все это состоит из символов.
Обновление
Если вы хотите создать изображение того же размера, что и оригинал, то подход не очень отличается, но даже здесь вы, как уже отмечал Марк, создаете растровое изображение для каждой буквы, которую вы используете.На самом деле я не вижу более быстрого способа сравнения мозаичных изображений с буквой, чтобы определить, какой из них является наиболее подходящим.
Возможно, один совет: Если вы используете этот подход,буквы будут видны на вашем изображении, потому что если у вас есть, например, шрифт 12pt, каждая буква будет иметь по крайней мере размер изображения около 10x15.Когда вы теперь конвертируете изображение размером 1000x1500, которое не так мало, вы используете только 100x100 букв.Поэтому, возможно, стоит подумать, чтобы не использовал само изображение, а градиенты изображения.Это может дать более качественные изображения, потому что тогда выбирается буква, которая следует за краями довольно хорошо.Используя только градиенты, логотип Google выглядит не так плохо