ASCII-kunst in Java

1. Overzicht

In dit artikel bespreken we het maken van een grafische afdruk van ASCII-tekens of Snaren in Java, met behulp van concepten uit de 2D grafische ondersteuning van de taal.

2. Tekenreeksen met 2D-afbeeldingen

Met behulp van de Grafische 2D klasse, is het mogelijk om een Draad als een afbeelding, bereikt door het aanroepen van de drawString () methode.

Omdat Grafische 2D abstract is, kunnen we een instantie maken door deze uit te breiden en de verschillende methoden te implementeren die zijn gekoppeld aan de Grafische afbeeldingen klasse.

Hoewel dit een vervelende taak is, wordt dit vaak gedaan door een BufferedImage instantie in Java en het ophalen van de onderliggende waarde Grafische afbeeldingen instantie ervan:

BufferedImage bufferedImage = nieuwe BufferedImage (breedte, hoogte, BufferedImage.TYPE_INT_RGB); Grafische afbeeldingen = bufferedImage.getGraphics ();

2.1. Beeldmatrixindices vervangen door ASCII-teken

Bij het tekenen Snaren, de Grafische 2D klasse gebruikt een eenvoudige matrix-achtige techniek waarbij gebieden die het ontworpen uitsnijden Snaren krijgen een bepaalde waarde toegewezen, terwijl andere een nulwaarde krijgen.

Om het gebeeldhouwde gebied te kunnen vervangen door het gewenste ASCII-teken, moeten we de waarden van het gebeeldhouwde gebied detecteren als een enkel gegevenspunt (bijvoorbeeld een geheel getal) en niet de RGB-kleurwaarden.

Om de RGB-kleur van de afbeelding weer te geven als een geheel getal, stellen we het afbeeldingstype in op de modus gehele getallen:

BufferedImage bufferedImage = nieuwe BufferedImage (breedte, hoogte, BufferedImage.TYPE_INT_RGB);

Het fundamentele idee is om de waarden die zijn toegewezen aan indices die niet gelijk zijn aan nul van de beeldmatrix te vervangen door het gewenste artistieke karakter.

Terwijl indices van de matrix die de nulwaarde vertegenwoordigen, een enkele spatie krijgen toegewezen. Het nuldequivalent van de integer-modus is -16777216.

3. ASCII-kunstgenerator

Laten we eens kijken naar een geval waarin we een ASCII-kunst moeten maken van de "BAELDUNG" -reeks.

We beginnen met het maken van een lege afbeelding met de gewenste breedte / hoogte en het afbeeldingstype ingesteld op integer-modus zoals vermeld in sectie 2.1.

Om geavanceerde weergave-opties van 2D-afbeeldingen in Java te kunnen gebruiken, casten we onze Grafische afbeeldingen bezwaar maken tegen een Grafische 2D voorbeeld. Vervolgens stellen we de gewenste renderingparameters in voordat we de drawString () methode met de "BAELDUNG" Draad:

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

In het bovenstaande vertegenwoordigen 12 en 24 respectievelijk de x- en y-coördinaten voor het punt op de afbeelding waar het afdrukken van de tekst zou moeten beginnen.

Nu hebben we een 2D-afbeelding waarvan de onderliggende matrix twee soorten onderscheiden waarden bevat; niet-nul en nul indices.

Maar om het concept te begrijpen, gaan we door de tweedimensionale array (of matrix) en vervangen we alle waarden door het ASCII-teken "*" door:

for (int y = 0; y <settings.height; y ++) {StringBuilder stringBuilder = nieuwe StringBuilder (); voor (int x = 0; x <settings.width; x ++) {stringBuilder.append ("*"); } if (stringBuilder.toString (). trim (). isEmpty ()) {ga verder; } System.out.println (stringBuilder); }

De uitvoer van het bovenstaande toont slechts een blok sterretjes (*) zoals hieronder te zien is:

Als we onderscheid maken tussen de vervanging door "*" door alleen de gehele getallen gelijk aan -16777216 te vervangen door "*" en de rest door "":

for (int y = 0; y <settings.height; y ++) {StringBuilder stringBuilder = nieuwe StringBuilder (); for (int x = 0; x <settings.width; x ++) {stringBuilder.append (image.getRGB (x, y) == -16777216? "*": ""); } if (stringBuilder.toString (). trim (). isEmpty ()) {ga verder; } System.out.println (stringBuilder); }

We krijgen een andere ASCII-kunst die overeenkomt met onze snaar "BAELDUNG" maar in een omgekeerd snijwerk zoals deze:

Ten slotte keren we de discriminatie om door de gehele waarden gelijk aan -16777216 te vervangen door "" en de rest door "*":

for (int y = 0; y <settings.height; y ++) {StringBuilder stringBuilder = nieuwe StringBuilder (); for (int x = 0; x <settings.width; x ++) {stringBuilder.append (image.getRGB (x, y) == -16777216? "": "*"); } if (stringBuilder.toString (). trim (). isEmpty ()) {ga verder; } System.out.println (stringBuilder); }

Dit geeft ons een ASCII-kunst van het gewenste Draad:

4. Conclusie

In deze korte zelfstudie hebben we bekeken hoe u ASCII-kunst in Java kunt maken met behulp van de ingebouwde 2D-grafische bibliotheek.

Hoewel we specifiek voor de tekst hebben laten zien; "BAELDUNG", de broncode op Github biedt een hulpprogramma dat elke functie accepteert Draad.

De broncode is, zoals altijd, te vinden op GitHub.