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);
}
Вывод выше показывает только блок звездочек (*), как показано ниже:
Если мы разделим замену на «” 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, которое соответствует нашему «примеру» строки, но в виде перевернутой резьбы, например:
Наконец, мы инвертируем дискриминацию, заменяя целочисленные значения, равные -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:
4. Заключение
В этом кратком руководстве мы рассмотрели, как создавать ASCII-графику на Java с использованием встроенной библиотеки 2D-графики.
Пока мы показали специально для текста; «Пример», исходный код на Github предоставляет служебную функцию, которая принимает любыеString.
Исходный код, как всегда, можно найтиover on GitHub.