Java中的ASCII艺术

ASCII Art in Java

1.概述

在本文中,我们将讨论使用Java语言的2D图形支持中的概念来创建Java中ASCII字符或字符串的图形打印。

2.用2D图形绘制字符串

借助于Graphics2D类,可以通过调用drawString()方法将String绘制为图像。

因为Graphics2D是抽象的,所以我们可以通过扩展实例并实现与Graphics类相关的各种方法来创建实例。

尽管这是一个繁琐的任务,但通常可以通过在Java中创建BufferedImage实例并从中获取其基础Graphics实例来完成:

1
2
3
4
BufferedImage bufferedImage = new BufferedImage(
  width, height,
  BufferedImage.TYPE_INT_RGB);
Graphics graphics = bufferedImage.getGraphics();

2.1。 用ASCII字符替换图像矩阵索引

绘制String时,Graphics2D类使用一种类似于矩阵的简单技术,在其中,将对设计出的String进行精雕细琢的区域分配一个特定的值,而将其他分配给零的值。

为了能够用所需的ASCII字符替换雕刻区域,我们需要将雕刻区域的值检测为单个数据点(例如整数)而不是RGB颜色值。

为了将图像的RGB颜色表示为整数,我们将图像类型设置为整数模式:

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

基本思想是用所需的艺术特征替换分配给图像矩阵非零索引的值。

而代表零值的矩阵索引将被分配一个空格字符。 整数模式的零等效值为-16777216。

3. ASCII Art Generator

让我们考虑一下需要对" BAELDUNG"字符串进行ASCII处理的情况。

我们首先创建一个具有所需宽度/高度的空图像,并将图像类型设置为整数模式(如第2.1节所述)。

为了能够在Java中使用2D图形的高级渲染选项,我们将Graphics对象转换为Graphics2D实例。 然后,在使用" BAELDUNG"字符串调用drawString()方法之前,我们设置所需的渲染参数:

1
2
3
4
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图形,其基础矩阵包含两种类型的判别值: 非零和零索引。

但是,为了让我们理解这个概念,我们将遍历二维数组(或矩阵),并将所有值替换为ASCII字符" *":

1
2
3
4
5
6
7
8
9
10
11
12
13
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);
}

上面的输出仅显示一个星号(*)块,如下所示:

 width=

如果我们用" *"来区分替换,只用" *"替换等于-16777216的整数,而用""替换其余的:

1
2
3
4
5
6
7
8
9
10
11
12
13
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);
}

我们获得了与我们的字符串" BAELDUNG"相对应的另一种ASCII艺术,但采用的是倒置雕刻,如下所示:

 width=

最后,我们通过将等于-16777216的整数值替换为"",并将其余的值替换为" *"来反转区分:

1
2
3
4
5
6
7
8
9
10
11
12
13
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艺术:

 width=

4。结论

在本快速教程中,我们了解了如何使用内置的2D图形库在Java中创建ASCII艺术作品。

虽然我们已经专门为文本显示了; Github上的源代码" BAELDUNG"提供了一个实用程序函数,可以接受任何String。

与往常一样,可以在GitHub上找到源代码。