ASCII Art i Java

1. Oversigt

I denne artikel vil vi diskutere oprettelse af et grafisk print af ASCII-tegn eller Strenge i Java ved hjælp af begreber fra 2D-grafikunderstøttelsen af ​​sproget.

2. Tegning af strenge med 2D-grafik

Ved hjælp af Grafik2D klasse, er det muligt at tegne en Snor som et billede, opnået påberåbt sig drawString () metode.

Fordi Grafik2D er abstrakt, kan vi oprette en instans ved at udvide den og implementere de forskellige metoder, der er knyttet til Grafik klasse.

Selv om dette er en kedelig opgave, gøres det ofte ved at oprette en BufferedImage forekomst i Java og hentning af det underliggende Grafik eksempel fra det:

BufferedImage bufferedImage = ny BufferedImage (bredde, højde, BufferedImage.TYPE_INT_RGB); Grafikgrafik = bufferedImage.getGraphics ();

2.1. Udskiftning af billedmatrixindekser med ASCII-tegn

Når du tegner Strenge, det Grafik2D klasse bruger en simpel matrixlignende teknik, hvor regioner, der udskærer det designede Strenge tildeles en bestemt værdi, mens andre får en nulværdi.

For at vi kan erstatte det udskårne område med det ønskede ASCII-tegn, skal vi registrere værdierne i det udskårne område som et enkelt datapunkt (f.eks. Heltal) og ikke RGB-farveværdierne.

For at få billedets RGB-farve repræsenteret som et heltal, indstiller vi billedtypen til heltalstilstand:

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

Den grundlæggende idé er at erstatte de værdier, der er tildelt ikke-nul-indekser i billedmatrixen med den ønskede kunstneriske karakter.

Mens matrixindekser, der repræsenterer nulværdien, tildeles et enkelt mellemrumstegn. Nulækvivalenten for heltalstilstanden er -16777216.

3. ASCII Art Generator

Lad os overveje et tilfælde, hvor vi har brug for at lave en ASCII-kunst af "BAELDUNG" -strengen.

Vi begynder med at oprette et tomt billede med ønsket bredde / højde og billedtypen indstillet til heltalstilstand som nævnt i afsnit 2.1.

For at kunne bruge avancerede gengivelsesindstillinger for 2D-grafik i Java kaster vi vores Grafik modsætter sig en Grafik2D eksempel. Vi indstiller derefter de ønskede gengivelsesparametre, inden vi påberåber os drawString () metode med “BAELDUNG” Snor:

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

I ovenstående repræsenterer 12 og 24 henholdsvis x- og y-koordinaterne for det punkt på billedet, hvor tekstudskrivningen skal starte fra.

Nu har vi en 2D-grafik, hvis underliggende matrix indeholder to typer diskriminerede værdier; ikke-nul og nul indekser.

Men for at vi kan få konceptet, går vi gennem det 2-dimensionelle array (eller matrix) og erstatter alle værdier 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 (). erEmpty ()) {fortsæt; } System.out.println (stringBuilder); }

Outputtet fra ovenstående viser kun en blok med stjerner (*) som vist nedenfor:

Hvis vi diskriminerer udskiftningen med “*” ved kun at erstatte heltalets værdier svarende til -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 (). er tom ()) {fortsæt; } System.out.println (stringBuilder); }

Vi opnår en anden ASCII-kunst, der svarer til vores streng “BAELDUNG”, men i en omvendt udskæring som denne:

Endelig inverterer vi forskelsbehandlingen ved at erstatte heltalsværdier svarende til -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 (). er tom ()) {fortsæt; } System.out.println (stringBuilder); }

Dette giver os en ASCII-kunst af det ønskede Snor:

4. Konklusion

I denne hurtige vejledning så vi, hvordan man opretter ASCII-kunst i Java ved hjælp af det indbyggede 2D-grafikbibliotek.

Mens vi har vist specifikt til teksten; “BAELDUNG”, kildekoden på Github giver en hjælpefunktion, der accepterer enhver Snor.

Kildekode kan som altid findes på GitHub.