ASCII Art i Java

1. Oversikt

I denne artikkelen vil vi diskutere å lage en grafisk utskrift av ASCII-tegn eller Strenger i Java, ved hjelp av konsepter fra 2D-grafikkstøtten på språket.

2. Tegne strenger med 2D-grafikk

Ved hjelp av Grafikk2D klasse, er det mulig å tegne en String som et bilde, oppnådd ved å påkalle drawString () metode.

Fordi Grafikk2D er abstrakt, kan vi opprette en forekomst ved å utvide den og implementere de forskjellige metodene knyttet til Grafikk klasse.

Selv om dette er en kjedelig oppgave, gjøres det ofte ved å lage en BufferedImage forekomst i Java og henter den underliggende Grafikk eksempel fra det:

BufferedImage bufferedImage = ny BufferedImage (bredde, høyde, BufferedImage.TYPE_INT_RGB); Grafikkgrafikk = bufferedImage.getGraphics ();

2.1. Erstatte bildematriseindekser med ASCII-tegn

Når du tegner Strenger, de Grafikk2D klassen bruker en enkel matriselignende teknikk der regioner som skjærer ut det designet Strenger tildeles en bestemt verdi, mens andre får en nullverdi.

For at vi skal kunne erstatte det utskårne området med ønsket ASCII-tegn, må vi oppdage verdiene til det utskårne området som et enkelt datapunkt (f.eks. Heltall) og ikke RGB-fargeværdiene.

For å få bildens RGB-farge representert som et heltall, setter vi bildetypen til heltallsmodus:

BufferedImage bufferedImage = ny BufferedImage (bredde, høyde, BufferedImage.TYPE_INT_RGB);

Den grunnleggende ideen er å erstatte verdiene som er tildelt ikke-null-indekser i bildematriksen med ønsket kunstnerisk karakter.

Mens indeksene til matrisen som representerer nullverdien, tildeles ett enkelt mellomromstegn. Null-ekvivalenten til heltallsmodusen er -16777216.

3. ASCII Art Generator

La oss vurdere et tilfelle der vi trenger å lage en ASCII-kunst av "BAELDUNG" -strengen.

Vi begynner med å lage et tomt bilde med ønsket bredde / høyde og bildetypen satt til heltallsmodus som nevnt i avsnitt 2.1.

For å kunne bruke avanserte gjengivelsesalternativer for 2D-grafikk i Java, kastet vi vår Grafikk motsette seg en Grafikk2D forekomst. Vi setter deretter de ønskede gjengivelsesparametrene før vi påberoper oss drawString () metoden med “BAELDUNG” Streng:

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

I ovenstående representerer 12 og 24 henholdsvis x- og y-koordinatene for punktet på bildet der tekstutskriften skal starte fra.

Nå har vi en 2D-grafikk hvis underliggende matrise inneholder to typer diskriminerte verdier; ikke-null og null indekser.

Men for at vi skal få konseptet, vil vi gå gjennom den 2-dimensjonale matrisen (eller matrisen) og erstatte alle verdier med ASCII-tegnet "*" med:

for (int y = 0; y <settings.height; y ++) {StringBuilder stringBuilder = new StringBuilder (); for (int x = 0; x <settings.width; x ++) {stringBuilder.append ("*"); } hvis (stringBuilder.toString (). trim (). isEmpty ()) {fortsett; } System.out.println (stringBuilder); }

Utdataene fra ovenstående viser bare en blokk med stjerner (*) som vist nedenfor:

Hvis vi diskriminerer erstatningen med "*" ved å erstatte bare heltallverdiene lik -16777216 med "*" og resten med "":

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? "*": ""); } hvis (stringBuilder.toString (). trim (). isEmpty ()) {fortsett; } System.out.println (stringBuilder); }

Vi får en annen ASCII-kunst som tilsvarer strengen "BAELDUNG", men i en omvendt utskjæring som denne:

Til slutt inverterer vi diskrimineringen ved å erstatte heltallverdiene lik -16777216 med ”” og resten med “*”:

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? "": "*"); } hvis (stringBuilder.toString (). trim (). isEmpty ()) {fortsett; } System.out.println (stringBuilder); }

Dette gir oss en ASCII-kunst av det ønskede Streng:

4. Konklusjon

I denne raske opplæringen så vi på hvordan du lager ASCII-kunst i Java ved hjelp av det innebygde 2D-grafikkbiblioteket.

Mens vi har vist spesielt for teksten; “BAELDUNG”, kildekoden på Github gir en verktøyfunksjon som godtar alle String.

Kildekoden, som alltid, kan du finne på GitHub.


$config[zx-auto] not found$config[zx-overlay] not found