Arte ASCII em Java
1. Visão geral
Neste artigo, discutiremos a criação de uma impressão gráfica de caracteres ASCII ouStrings em Java, usando conceitos do suporte gráfico 2D da linguagem.
2. Desenhando Strings com Gráficos 2D
Com a ajuda da classeGraphics2D, é possível desenhar umString como uma imagem, obtido invocando o métododrawString().
ComoGraphics2D é abstrato, podemos criar uma instância estendendo-a e implementando os vários métodos associados à classeGraphics.
Embora seja uma tarefa tediosa, geralmente é feito criando uma instânciaBufferedImage em Java e recuperando sua instânciaGraphics subjacente a partir dele:
BufferedImage bufferedImage = new BufferedImage(
width, height,
BufferedImage.TYPE_INT_RGB);
Graphics graphics = bufferedImage.getGraphics();
2.1. Substituição de índices de matriz de imagem por caracteres ASCII
Ao desenharStrings,, a classeGraphics2D usa uma técnica simples de matriz em que as regiões que esculpem osStrings projetados recebem um valor particular, enquanto outras recebem um valor zero.
Para podermos substituir a área esculpida pelo caractere ASCII desejado, precisamos detectar os valores da região esculpida como um único ponto de dados (por exemplo, inteiro) e não os valores de cores RGB.
Para ter a cor RGB da imagem representada como um número inteiro, definimos o tipo de imagem para o modo inteiro:
BufferedImage bufferedImage = new BufferedImage(
width, height,
BufferedImage.TYPE_INT_RGB);
A ideia fundamental é substituir os valores atribuídos aos índices diferentes de zero da matriz da imagem pelo caráter artístico desejado.
Enquanto os índices da matriz que representam o valor zero receberão um único caractere de espaço. O equivalente a zero do modo inteiro é -16777216.
3. ASCII Art Generator
Vamos considerar um caso em que precisamos fazer uma arte ASCII da string de "exemplo".
Começamos criando uma imagem vazia com a largura / altura desejada e o tipo de imagem definido como modo inteiro, conforme mencionado na seção 2.1.
Para poder usar opções de renderização avançadas de gráficos 2D em Java, lançamos nosso objetoGraphics para uma instânciaGraphics2D.. Em seguida, definimos os parâmetros de renderização desejados antes de invocar odrawString()método s com o "exemplo"String:
Graphics2D graphics2D = (Graphics2D) graphics;
graphics2D.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING,
RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
graphics2D.drawString("example", 12, 24);
Acima, 12 e 24 representam, respectivamente, as coordenadas x e y para o ponto na imagem em que a impressão de texto deve começar.
Agora, temos um gráfico 2D cuja matriz subjacente contém dois tipos de valores discriminados; índices diferentes de zero e zero.
Mas, para obtermos o conceito, passaremos pela matriz bidimensional (ou matriz) e substituiremos todos os valores pelo caractere ASCII "*" por:
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);
}
A saída acima mostra apenas um bloco de asteriscos (*), como visto abaixo:
Se discriminarmos a substituição por "” by replacing only the integer values equal to -16777216 with “" e o resto por "":
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);
}
Obtemos uma arte ASCII diferente que corresponde ao nosso "exemplo" de string, mas em uma escultura invertida como esta:
Por fim, invertemos a discriminação substituindo os valores inteiros iguais a -16777216 por ”” e o restante por “*”:
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);
}
Isso nos dá uma arte ASCII daString: desejada
4. Conclusão
Neste tutorial rápido, vimos como criar arte ASCII em Java usando a biblioteca de gráficos 2D embutida.
Embora tenhamos mostrado especificamente para o texto; “Exemplo”, o código-fonte no Github fornece uma função de utilidade que aceita qualquerString.
O código fonte, como sempre, pode ser encontradoover on GitHub.