ASCII Art in Java

1. Panoramica

In questo articolo, discuteremo la creazione di una stampa grafica di caratteri ASCII o stringhe in Java, utilizzando concetti dal supporto grafico 2D del linguaggio.

2. Disegno di stringhe con grafica 2D

Con l'aiuto della classe Graphics2D è possibile disegnare una String come immagine, ottenuta invocando il metodo drawString () .

Poiché Graphics2D è astratta, possiamo creare un'istanza estendendola e implementando i vari metodi associati alla classe Graphics .

Sebbene questa sia un'attività noiosa, spesso viene eseguita creando un'istanza BufferedImage in Java e recuperando la sua istanza Graphics sottostante da essa:

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

2.1. Sostituzione degli indici della matrice immagine con caratteri ASCII

Quando si disegnano stringhe, la classe Graphics2D utilizza una semplice tecnica simile a una matrice in cui alle regioni che ritagliano le stringhe progettate viene assegnato un valore particolare mentre ad altre viene assegnato un valore zero.

Per essere in grado di sostituire l'area scolpita con il carattere ASCII desiderato, dobbiamo rilevare i valori della regione scolpita come un singolo punto dati (es. Intero) e non i valori di colore RGB.

Per avere il colore RGB dell'immagine rappresentato come un numero intero, impostiamo il tipo di immagine in modalità intero:

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

L'idea fondamentale è sostituire i valori assegnati a indici diversi da zero della matrice dell'immagine con il carattere artistico desiderato.

Mentre agli indici della matrice che rappresentano il valore zero verrà assegnato un singolo carattere spazio. Lo zero equivalente della modalità numero intero è -16777216.

3. ASCII Art Generator

Consideriamo un caso in cui abbiamo bisogno di creare un'arte ASCII della stringa "BAELDUNG".

Iniziamo creando un'immagine vuota con larghezza / altezza desiderata e il tipo di immagine impostato sulla modalità intero come menzionato nella sezione 2.1.

Per essere in grado di utilizzare le opzioni di rendering avanzate di grafica 2D in Java, gettiamo la nostra Graphics oggetto a un Graphics2D un'istanza . Quindi impostiamo i parametri di rendering desiderati prima di invocare il metodo drawString () con la stringa "BAELDUNG" :

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

In quanto sopra, 12 e 24 rappresentano rispettivamente le coordinate xey per il punto dell'immagine da cui deve iniziare la stampa del testo.

Ora, abbiamo una grafica 2D la cui matrice sottostante contiene due tipi di valori discriminati; indici diversi da zero e zero.

Ma per ottenere il concetto, passeremo attraverso l'array bidimensionale (o matrice) e sostituiremo tutti i valori con il carattere ASCII "*" con:

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

L'output di quanto sopra mostra solo un blocco di asterischi (*) come mostrato di seguito:

Se discriminiamo la sostituzione con "*" sostituendo solo i valori interi pari a -16777216 con "*" e il resto con "":

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

Otteniamo un'arte ASCII diversa che corrisponde alla nostra stringa “BAELDUNG” ma in un intaglio invertito come questo:

Infine, invertiamo la discriminazione sostituendo i valori interi pari a -16777216 con "" e il resto con "*":

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

Questo ci dà un'arte ASCII della stringa desiderata :

4. Conclusione

In questo breve tutorial, abbiamo visto come creare arte ASCII in Java utilizzando la libreria grafica 2D incorporata.

Mentre abbiamo mostrato specificamente per il testo; "BAELDUNG", il codice sorgente su Github fornisce una funzione di utilità che accetta qualsiasi stringa.

Il codice sorgente, come sempre, può essere trovato su GitHub.