Рубрики
Без рубрики

Искусство ASCII на Java

Краткий пример создания простых ASCII-символов в Java.

Автор оригинала: 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 .