ASCII-Kunst in Java

1. Übersicht

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

2. Zeichnen von Zeichenfolgen mit 2D-Grafiken

Mit Hilfe der Graphics2D- Klasse ist es möglich, einen String als Bild zu zeichnen , wobei die drawString () -Methode aufgerufen wird.

Da Graphics2D abstrakt ist, können wir eine Instanz erstellen, indem wir sie erweitern und die verschiedenen Methoden implementieren, die der Graphics- Klasse zugeordnet sind.

Dies ist zwar eine mühsame Aufgabe, wird jedoch häufig durch Erstellen einer BufferedImage- Instanz in Java und Abrufen der zugrunde liegenden Grafikinstanz daraus ausgeführt:

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

2.1. Ersetzen von Bildmatrixindizes durch ASCII-Zeichen

Beim Zeichnen von Strings verwendet die Graphics2D- Klasse eine einfache matrixartige Technik, bei der Regionen, die die entworfenen Strings herausarbeiten, 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 (z. B. eine Ganzzahl) und nicht als RGB-Farbwerte erkennen.

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 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 Zeichenfolge „BAELDUNG“ 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 Renderoptionen für 2D-Grafiken in Java verwenden zu können, wandeln wir unser Graphics- Objekt in eine Graphics2D- Instanz um . Anschließend legen wir die gewünschten Renderparameter fest, bevor wir die drawString () -Methode mit der Zeichenfolge „BAELDUNG“ aufrufen :

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

Oben stellen 12 bzw. 24 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.

Um das Konzept zu 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 von oben zeigt nur einen Block von Sternchen (*), wie unten gezeigt:

Wenn wir die Ersetzung durch "*" unterscheiden, indem wir nur die ganzzahligen Werte 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); }

Wir erhalten eine andere ASCII-Kunst, die unserer Saite „BAELDUNG“ entspricht, jedoch in einer umgekehrten Schnitzerei wie dieser:

Schließlich invertieren wir die Unterscheidung, indem wir die ganzzahligen Werte 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 des gewünschten Strings:

4. Fazit

In diesem kurzen Tutorial haben wir uns angesehen, wie Sie ASCII-Grafiken in Java mithilfe der integrierten 2D-Grafikbibliothek erstellen.

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

Der Quellcode ist wie immer auf GitHub zu finden.