Art ASCII à Java

1. Vue d'ensemble

Dans cet article, nous aborderons la création d'une impression graphique de caractères ASCII ou de chaînes en Java, en utilisant les concepts de la prise en charge graphique 2D du langage.

2. Dessiner des chaînes avec des graphiques 2D

Avec l'aide de la classe Graphics2D , il est possible de dessiner une chaîne en tant qu'image, obtenue en appelant la méthode drawString () .

Comme Graphics2D est abstrait, nous pouvons créer une instance en l'étendant et en implémentant les différentes méthodes associées à la classe Graphics .

Bien qu'il s'agisse d'une tâche fastidieuse, elle est souvent effectuée en créant une instance BufferedImage en Java et en récupérant son instance Graphics sous-jacente :

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

2.1. Remplacement des indices de matrice d'image par des caractères ASCII

Lors du dessin de chaînes, la classe Graphics2D utilise une technique de type matrice simple dans laquelle les régions qui découpent les chaînes conçues se voient attribuer une valeur particulière tandis que d'autres reçoivent une valeur zéro.

Pour que nous puissions remplacer la zone sculptée par le caractère ASCII souhaité, nous devons détecter les valeurs de la région sculptée comme un point de données unique (par exemple un entier) et non les valeurs de couleur RVB.

Pour que la couleur RVB de l'image soit représentée sous forme d'entier, nous définissons le type d'image en mode entier:

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

L'idée fondamentale est de remplacer les valeurs attribuées aux indices non nuls de la matrice d'image par le caractère artistique souhaité.

Alors que les indices de la matrice représentant la valeur zéro se verront attribuer un seul caractère d'espace. L'équivalent zéro du mode entier est -16777216.

3. Générateur d'art ASCII

Considérons un cas où nous devons créer un art ASCII de la chaîne «BAELDUNG».

Nous commençons par créer une image vide avec la largeur / hauteur désirée et le type d'image réglé sur le mode entier comme mentionné dans la section 2.1.

Pour pouvoir utiliser les options de rendu avancées des graphiques 2D en Java, nous avons converti notre objet Graphics en une instance Graphics2D . Nous définissons ensuite les paramètres de rendu souhaités avant d'appeler la méthode drawString () avec la chaîne «BAELDUNG» :

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

Dans ce qui précède, 12 et 24 représentent respectivement les coordonnées x et y du point sur l'image d'où doit commencer l'impression du texte.

Maintenant, nous avons un graphique 2D dont la matrice sous-jacente contient deux types de valeurs discriminées; indices non nuls et nuls.

Mais pour que nous puissions comprendre le concept, nous allons parcourir le tableau (ou matrice) à 2 dimensions et remplacer toutes les valeurs par le caractère ASCII «*» par:

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); }

La sortie de ce qui précède montre juste un bloc d'astérisques (*) comme indiqué ci-dessous:

Si nous discriminons le remplacement par «*» en remplaçant uniquement les valeurs entières égales à -16777216 par «*» et le reste par «»:

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); }

On obtient un art ASCII différent qui correspond à notre chaîne «BAELDUNG» mais dans une sculpture inversée comme celle-ci:

Enfin, nous inversons la discrimination en remplaçant les valeurs entières égales à -16777216 par "" et le reste par "*":

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); }

Cela nous donne un art ASCII de la chaîne souhaitée :

4. Conclusion

Dans ce rapide didacticiel, nous avons examiné comment créer des illustrations ASCII en Java à l'aide de la bibliothèque graphique 2D intégrée.

Alors que nous avons montré spécifiquement pour le texte; «BAELDUNG», le code source sur Github fournit une fonction utilitaire qui accepte n'importe quelle chaîne.

Le code source, comme toujours, peut être trouvé sur GitHub.