Art ASCII en Java

ASCII Art en Java

1. Vue d'ensemble

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

2. Dessin de chaînes avec des graphiques 2D

À l’aide de la classeGraphics2D, il est possible de dessiner unString comme une image, obtenu en appelant la méthodedrawString().

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

Bien que cette tâche soit fastidieuse, elle s’effectue souvent en créant une instanceBufferedImage en Java et en y récupérant l’instance sous-jacenteGraphics:

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 deStrings,, la classeGraphics2D utilise une technique simple de type matrice où les régions qui découpent lesStringsconçus se voient attribuer une valeur particulière tandis que d'autres reçoivent une valeur zéro.

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

Pour que la couleur RVB de l'image soit représentée sous la forme d'un entier, nous définissons le type d'image sur le 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 index 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

Prenons un cas où nous devons créer un art ASCII de la chaîne «exemple».

Nous commençons par créer une image vide avec la largeur / hauteur souhaitée et le type d'image défini sur le mode entier, comme indiqué à la section 2.1.

Pour pouvoir utiliser les options de rendu avancées des graphiques 2D en Java, nous convertissons notre objetGraphics en une instanceGraphics2D. Nous définissons ensuite les paramètres de rendu souhaités avant d'appeler ledrawString()méthode s avec l '«exemple»String:

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

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

Nous avons maintenant 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 à deux dimensions (ou matrice) 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 ne montre qu’un bloc d’astérisques (*), comme indiqué ci-dessous:

image

 

Si nous discriminons le remplacement par «” by replacing only the integer values equal to -16777216 with “» 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);
}

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

image

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 desString: désirés

image

 

4. Conclusion

Dans ce rapide didacticiel, nous avons examiné la création d’art ASCII en Java à l’aide de la bibliothèque graphique 2D intégrée.

Alors que nous avons montré spécifiquement pour le texte; «Exemple», le code source sur Github fournit une fonction utilitaire qui accepte tous lesString.

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