ASCII Искусство на Яве

ASCII Искусство на Яве

1. обзор

В этой статье мы обсудим создание графической печати символов ASCII илиStrings в Java с использованием концепций поддержки 2D-графики в языке.

2. Рисование строк с помощью 2D-графики

С помощью классаGraphics2D можно нарисоватьString как изображение, что достигается вызовом методаdrawString().

ПосколькуGraphics2D является абстрактным, мы можем создать экземпляр, расширив его и реализовав различные методы, связанные с классомGraphics.

Хотя это утомительная задача, она часто выполняется путем создания экземпляраBufferedImage в Java и извлечения из него базового экземпляраGraphics:

BufferedImage bufferedImage = new BufferedImage(
  width, height,
  BufferedImage.TYPE_INT_RGB);
Graphics graphics = bufferedImage.getGraphics();

2.1. Замена индексов матрицы изображения символом ASCII

При отрисовкеStrings, классGraphics2D использует простую матричную технику, где областям, которые вырезают спроектированныеStrings, присваивается конкретное значение, а другим присваивается нулевое значение.

Чтобы мы могли заменить вырезанную область желаемым символом ASCII, нам необходимо определить значения вырезанной области как одну точку данных (например, целое число), а не значения цвета RGB.

Чтобы цвет RGB изображения был представлен в виде целого числа, мы устанавливаем тип изображения в целочисленный режим:

BufferedImage bufferedImage = new BufferedImage(
  width, height,
  BufferedImage.TYPE_INT_RGB);

Основная идея - заменить значения, присвоенные ненулевым индексам матрицы изображения, желаемым художественным характером.

При этом индексам матрицы, представляющим нулевое значение, будет присвоен один пробел. Нулевым эквивалентом целочисленного режима является -16777216.

3. Генератор изображений ASCII

Давайте рассмотрим случай, когда нам нужно создать ASCII-изображение строки «example».

Мы начинаем с создания пустого изображения с желаемой шириной / высотой и типом изображения, установленным в целочисленный режим, как упомянуто в разделе 2.1.

Чтобы иметь возможность использовать расширенные параметры рендеринга 2D-графики в Java, мы приводим наш объектGraphics к экземпляруGraphics2D.. Затем мы устанавливаем желаемые параметры рендеринга перед вызовомdrawString() метод с «примером»String:

Graphics2D graphics2D = (Graphics2D) graphics;
graphics2D.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING,
  RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
graphics2D.drawString("example", 12, 24);

Выше 12 и 24 представляют соответственно координаты x и y для точки на изображении, с которой должна начинаться печать текста.

Теперь у нас есть двумерная графика, базовая матрица которой содержит два типа различаемых значений; ненулевые и нулевые индексы.

Но для того, чтобы получить концепцию, мы пройдемся по двумерному массиву (или матрице) и заменим все значения символом 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);
}

Вывод выше показывает только блок звездочек (*), как показано ниже:

image

 

Если мы разделим замену на «” by replacing only the integer values equal to -16777216 with “», а остальные на «»:

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, которое соответствует нашему «примеру» строки, но в виде перевернутой резьбы, например:

image

Наконец, мы инвертируем дискриминацию, заменяя целочисленные значения, равные -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 желаемогоString:

image

 

4. Заключение

В этом кратком руководстве мы рассмотрели, как создавать ASCII-графику на Java с использованием встроенной библиотеки 2D-графики.

Пока мы показали специально для текста; «Пример», исходный код на Github предоставляет служебную функцию, которая принимает любыеString.

Исходный код, как всегда, можно найтиover on GitHub.