Автор оригинала: Chris Oberle.
1. Обзор
В этой статье мы обсудим создание графической печати символов ASCII или Строк в Java, используя концепции из поддержки 2D-графики языка.
2. Рисование Строк С Помощью 2D-Графики
С помощью класса Graphics2D можно нарисовать Строку в виде изображения, вызвав метод drawString () .
Поскольку Graphics2D является абстрактным, мы можем создать экземпляр, расширив его и реализовав различные методы, связанные с классом Graphics .
Хотя это утомительная задача, она часто выполняется путем создания экземпляра BufferedImage в Java и извлечения из него базового экземпляра Graphics :
BufferedImage bufferedImage = new BufferedImage( width, height, BufferedImage.TYPE_INT_RGB); Graphics graphics = bufferedImage.getGraphics();
2.1. Замена Индексов Матрицы Изображений Символом ASCII
При рисовании Строк класс Graphics2D использует простую матричную технику, когда областям, которые вырезают спроектированные Строки , присваивается определенное значение, в то время как другим присваивается нулевое значение.
Чтобы мы могли заменить вырезанную область нужным символом ASCII, нам нужно определить значения вырезанной области как единственную точку данных (например, целое число), а не значения цвета RGB.
Чтобы цвет RGB изображения был представлен в виде целого числа, мы устанавливаем тип изображения в целочисленный режим:
BufferedImage bufferedImage = new BufferedImage( width, height, BufferedImage.TYPE_INT_RGB);
Фундаментальная идея состоит в том, чтобы заменить значения, присвоенные ненулевым индексам матрицы изображения, желаемым художественным характером.
В то время как индексам матрицы, представляющим нулевое значение, будет присвоен один символ пробела. Нулевой эквивалент целочисленного режима равен -16777216.
3. Генератор ASCII-изображений
Давайте рассмотрим случай, когда нам нужно сделать ASCII-изображение строки “BAELDUNG”.
Мы начинаем с создания пустого изображения с требуемой шириной/высотой и типом изображения, установленным в целочисленный режим, как указано в разделе 2.1.
Чтобы иметь возможность использовать расширенные параметры рендеринга 2D-графики в Java, мы приведем наш объект Graphics к экземпляру Graphics2D . Затем мы задаем необходимые параметры рендеринга перед вызовом метода drawString() со строкой “BAELDUNG” :
Graphics2D graphics2D = (Graphics2D) graphics; graphics2D.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON); graphics2D.drawString("BAELDUNG", 12, 24);
В приведенном выше примере 12 и 24 представляют соответственно координаты x и y для точки на изображении, с которой должна начинаться печать текста.
Теперь у нас есть 2D-графика, базовая матрица которой содержит два типа дискриминируемых значений: ненулевые и нулевые индексы.
Но для того, чтобы мы получили концепцию, мы пройдем через 2-мерный массив (или матрицу) и заменим все значения символом ASCII “*” на:
for (int y = 0; y < settings.height; y++) { StringBuilder stringBuilder = new StringBuilder(); for (int x = 0; x < settings.width; x++) { stringBuilder.append("*"); } if (stringBuilder.toString().trim().isEmpty()) { continue; } System.out.println(stringBuilder); }
Вывод выше показывает только блок звездочек ( * ), как показано ниже:
Если мы различим замену на”*”, заменив только целочисленные значения, равные -16777216, на”*”, а остальные на ” “:
for (int y = 0; y < settings.height; y++) { StringBuilder stringBuilder = new StringBuilder(); for (int x = 0; x < settings.width; x++) { stringBuilder.append(image.getRGB(x, y) == -16777216 ? "*" : " "); } if (stringBuilder.toString().trim().isEmpty()) { continue; } System.out.println(stringBuilder); }
Мы получаем другое искусство ASCII, которое соответствует нашей строке “BAELDUNG”, но в перевернутом виде, как это:
Наконец, мы инвертируем дискриминацию, заменив целочисленные значения, равные -16777216, на””, а остальные-на “*”:
for (int y = 0; y < settings.height; y++) { StringBuilder stringBuilder = new StringBuilder(); for (int x = 0; x < settings.width; x++) { stringBuilder.append(image.getRGB(x, y) == -16777216 ? " " : "*"); } if (stringBuilder.toString().trim().isEmpty()) { continue; } System.out.println(stringBuilder); }
Это дает нам ASCII-код желаемой строки :
4. Заключение
В этом кратком руководстве мы рассмотрели, как создавать ASCII-рисунки на Java с помощью встроенной библиотеки 2D – графики.
Хотя мы показали специально для текста; “BAELDUNG”, исходный код на Github предоставляет служебную функцию, которая принимает любую строку .
Исходный код, как всегда, можно найти на GitHub .