ASCII-Art in Java

ASCII-Kunst in Java

1. Überblick

In diesem Artikel wird das Erstellen eines grafischen Ausdrucks von ASCII-Zeichen oderStringsin Java unter Verwendung von Konzepten aus der 2D-Grafikunterstützung der Sprache erläutert.

2. Zeichenfolgen mit 2D-Grafiken zeichnen

Mit Hilfe derGraphics2D-Klasse ist es möglich,String als Bild zu zeichnen, wobei diedrawString()-Methode aufgerufen wird.

DaGraphics2D abstrakt ist, können wir eine Instanz erstellen, indem wir sie erweitern und die verschiedenen Methoden implementieren, die der KlasseGraphics zugeordnet sind.

Dies ist zwar eine mühsame Aufgabe, wird jedoch häufig durchgeführt, indem eineBufferedImage-Instanz in Java erstellt und die zugrunde liegendeGraphics-Instanz daraus abgerufen wird:

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

2.1. Ersetzen von Bildmatrixindizes durch ASCII-Zeichen

Beim Zeichnen vonStrings, verwendet die KlasseGraphics2D eine einfache matrixartige Technik, bei der Regionen, die die entworfenenStrings herausschneiden, ein bestimmter Wert zugewiesen wird, während anderen ein nullter Wert zugewiesen wird.

Damit wir den geschnitzten Bereich durch das gewünschte ASCII-Zeichen ersetzen können, müssen wir die Werte des geschnitzten Bereichs als einen einzelnen Datenpunkt erfassen (z. Ganzzahl) und nicht die RGB-Farbwerte.

Damit die RGB-Farbe des Bildes als Ganzzahl dargestellt wird, setzen wir den Bildtyp auf den Ganzzahlmodus:

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

Die Grundidee besteht darin, die Werte, die Nicht-Null-Indizes der Bildmatrix zugewiesen sind, durch den gewünschten künstlerischen Charakter zu ersetzen.

Während den Indizes der Matrix, die den Nullwert darstellen, ein einzelnes Leerzeichen zugewiesen wird. Das Nulläquivalent des Ganzzahlmodus ist -16777216.

3. ASCII Art Generator

Betrachten wir einen Fall, in dem wir eine ASCII-Grafik aus der "Beispiel" -String erstellen müssen.

Wir beginnen mit der Erstellung eines leeren Bildes mit der gewünschten Breite / Höhe und dem Bildtyp, der auf den Ganzzahlmodus eingestellt ist, wie in Abschnitt 2.1 erwähnt.

Um erweiterte Rendering-Optionen für 2D-Grafiken in Java verwenden zu können, wandeln wir unserGraphics-Objekt in eineGraphics2D-Instanz.um. Anschließend legen wir die gewünschten Rendering-Parameter fest, bevor wirdrawString()aufrufen. s Methode mit dem "Beispiel"String:

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

In den obigen Darstellungen stellen 12 und 24 jeweils die x- und y-Koordinaten für den Punkt auf dem Bild dar, an dem der Textdruck beginnen soll.

Jetzt haben wir eine 2D-Grafik, deren zugrunde liegende Matrix zwei Arten von diskriminierten Werten enthält. Nicht-Null- und Null-Indizes.

Damit wir das Konzept erhalten, gehen wir das zweidimensionale Array (oder die Matrix) durch und ersetzen alle Werte durch das ASCII-Zeichen „*“ durch:

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

Die Ausgabe oben zeigt nur einen Block mit Sternchen (*), wie unten dargestellt:

image

 

Wenn wir den Ersatz durch "” by replacing only the integer values equal to -16777216 with “" und den Rest durch "" unterscheiden:

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

Wir erhalten eine andere ASCII-Grafik, die unserem String-Beispiel entspricht, jedoch in einer umgekehrten Schnitzerei wie dieser:

image

Zum Schluss kehren wir die Unterscheidung um, indem wir die Ganzzahlwerte gleich -16777216 durch "" und den Rest durch "*" ersetzen:

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

Dies gibt uns eine ASCII-Kunst der gewünschtenString:

image

 

4. Fazit

In diesem kurzen Tutorial haben wir uns mit der Erstellung von ASCII-Grafiken in Java mithilfe der integrierten 2D-Grafikbibliothek befasst.

Während wir speziell für den Text gezeigt haben; "Beispiel", der Quellcode auf Github bietet eine Dienstprogrammfunktion, die alleString. akzeptiert

Der Quellcode befindet sich wie immer inover on GitHub.