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 |
基本思想是用所需的艺术特征替换分配给图像矩阵非零索引的值。
而代表零值的矩阵索引将被分配一个空格字符。 整数模式的零等效值为-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); } |
上面的输出仅显示一个星号(*)块,如下所示:
如果我们用" *"来区分替换,只用" *"替换等于-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艺术,但采用的是倒置雕刻,如下所示:
最后,我们通过将等于-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艺术:
4。结论
在本快速教程中,我们了解了如何使用内置的2D图形库在Java中创建ASCII艺术作品。
虽然我们已经专门为文本显示了; Github上的源代码" BAELDUNG"提供了一个实用程序函数,可以接受任何String。
与往常一样,可以在GitHub上找到源代码。