Техника создания иллюстраций с помощью печатных символов появилась задолго до появления компьютеров – в конце 19-го века. Первые текстовые изображения создавали на печатных машинках и публиковали в руководствах для машинисток в качестве упражнений:
При создании изображений на печатной машинке можно располагать символы внахлест – благодаря этому изображения выглядят почти как типографские иллюстрации. Автором первой полноценной текстовой иллюстрации считается машинистка Флора Стэйси. Эта картинка была опубликована в «Фонетическом журнале» в октябре 1898 г:
С появлением первых компьютеров текстовый арт сразу вышел на новый уровень: теперь печатную графику можно было создавать программно. Первые примеры ASCII-арта можно найти в компьютерных журналах и документации 1960-х годов, чуть позже с помощью ASCII стали создавать сложную графику, анимацию и игры.
Компьютерная графика прошла долгий путь от простых текстовых артов до фотореалистичных изображений, сгенерированных с помощью ИИ. Но ASCII-арт никуда не делся и продолжает пользоваться популярностью: энтузиасты создают программы для генерации и редактирования текстовой графики/анимации, делают ASCII-версии «Звездных войн» и потрясающие игры.
Как конвертировать изображение в ASCII-арт с помощью Python
Мы напишем приложение для генерации ASCII-графики на Python. Это приложение:
- Обрабатывает изображения в форматах jpg, png и bmp.
- Имеет GUI (интерфейс) на Tkinter.
- Сохраняет готовый ASCII-арт в текстовом файле с тем же именем, что и название исходного изображения.
У приложения есть одна внешняя зависимость – библиотека Pillow, которую необходимо установить с помощью команды pip install pillow
.
В библиотеке Pillow есть множество инструментов для сложных манипуляций с изображениями. В нашем случае Pillow поможет:
- Уменьшить исходное изображение до желаемой ширины, и пропорционально скорректировать его высоту.
- Преобразовать изображение в оттенки серого.
Интерфейс
Создание основного окна приложения
В начале кода мы
импортируем необходимые модули и создаем класс ImageToASCIIConverter
. Этот класс будет основным окном нашего приложения. В конструкторе __init__
мы определяем размеры окна и его
положение на экране, а также инициализируем словарь для хранения ссылок на изображения:
Создание виджетов
Метод create_widgets
отвечает за создание всех виджетов (кнопок, текстовых полей, холста для отображения изображений) в окне приложения. Здесь мы создаем фреймы для размещения виджетов, холст для отображения исходного изображения, текстовое поле для отображения ASCII-арта, а также кнопки для выбора изображения, преобразования его в ASCII-арт и сохранения результата:
Основная функциональность
Выбор изображения
Метод choose_image
открывает диалоговое окно для выбора файла
изображения. Все доступные для обработки форматы файлов определены в image_exts
, при желании пользователь может выбрать изображение определенного формата. Если пользователь выбирает изображение, оно отображается на
холсте, а кнопка Конвертировать становится доступной для нажатия:
Преобразование изображения в ASCII-арт
Процесс создания ASCII-версии исходного изображения состоит из нескольких этапов:
- Пропорциональное уменьшение картинки. Изображение уменьшается до желаемого размера с помощью метода resize_img. Примечание: ASCII-версия получается слегка вытянутой по вертикали. Пропорции можно скорректировать, уменьшив высоту, но мелкие детали при этом теряются.
- Преобразование исходного изображения в оттенки серого. Это делается для упрощения процесса конвертации, так как оттенки серого позволяют более точно оценить яркость каждого пикселя. Метод
pixel_to_grayscale
принимает изображение в качестве аргумента и использует методconvert("L")
из библиотеки Pillow для преобразования изображения в оттенки серого.
- Сопоставление каждого пикселя с соответствующим ASCII-символом. Метод
pixel_to_ascii
принимает изображение в оттенках серого и извлекает данные о пикселях с помощью методаgetdata()
. Затем для каждого пикселя вычисляется индекс в списке ASCII_CHAR, который зависит от его яркости. Этот список содержит символы, отражающие различные уровни яркости, начиная от самых темных (@
) до самых светлых (.
) Для вычисления индекса яркость пикселя делится на 25 (поскольку в списке ASCII_CHAR 25 символов, каждый из которых представляет определенный диапазон яркости), и результат округляется вниз до ближайшего целого числа. В результате получается строка, состоящая из ASCII-символов, представляющих исходное изображение.
- Конвертация изображения в ASCII-арт. Метод
convert_to_ascii
объединяет предыдущие три шага – sначала изображение уменьшается до желаемого размера, затем преобразуется в оттенки серого и, наконец, каждый пиксель преобразуется в ASCII-символ. Полученная строка ASCII-символов форматируется так, чтобы каждый символ соответствовал одному пикселю исходного изображения, и разбивается на строки с заданной шириной.
Код готового приложения можно взять в репозитории ascii_art.
Заключение
Несмотря на потрясающие возможности современной компьютерной графики, ASCII-арт остается популярным – благодаря своей уникальной эстетике, ностальгическому очарованию и обширным возможностям для творчества. С помощью ограниченного набора текстовых символов ASCII-художники создают удивительные визуальные образы, демонстрируя свое мастерство и умение работать в рамках ограниченной «палитры».
Новые проекты появляются регулярно, один из последних интересных примеров – ASCII-кинотеатр, в котором показывают текстовые версии новинок кинопроката. В общем, несмотря на свой почтенный возраст, ASCII-арт продолжает жить, вдохновляя творческих людей на новые эксперименты, позволяющие им воплотить свои идеи в самой минималистичной, но вместе с тем элегантной и выразительной форме текстового искусства.
Хочешь создавать крутые проекты, как генератор ASCII-графики? Курс «Основы программирования на Python» от Proglib Academy поможет тебе начать:
- Освоишь базу Python
- Научишься тестировать код
- Создашь бота для Телеграм, калькулятор для ипотеки, генератор безопасных паролей
Комментарии