Áttekintjük a karakteralapú rajzolás lehetőségeit Java 2D grafikával, illetve a karakterfüzérek képként való kezelésének újabb lehetőségeit is.
Az ASCII művészet jelentése és kezdete
Az ábécék betűiből/szövegeiből kialakított ábrák egyidősek lehetnek az írásbeliséggel. A technológiától függetlenül a karakterekből kialakított kép megjeleníthető: papír és penna vagy írógép, illetve számítógép és nyomtató vagy monitor segítségével.
Az ASCII művészet (ASCII art) tágabb értelemben a szövegalapú vizuális művészetre vonatkozik. Szűkebb értelemben véve a számítógépes grafika részterületének tekinthető. Az ASCII művészet számítógépet használ nyomtatható standard ASCII kompatibilis karakterekből álló képek készítéséhez és megjelenítéséhez. A képeken a képi elemek a nyomtatható karakterek, amelyek a pointilizmushoz hasonló optikai effektust mutatnak.
A művészeti ág indulása arra vezethető vissza, hogy a korai nyomtatókkal nem lehetett grafikát nyomtatni, a monitorokon nem lehetett grafikát megjeleníteni. Cégek, programok bannerjeinek, logóinak készítésére pedig akkor is volt igény. Ezek mellett például prezentációkhoz, kapcsolási rajzokhoz is használták az ASCII művészetet, valamint természetesen a korai e-mailekben is. A grafikus kártyák megjelenése előtti időkben pedig a videójátékok „grafikája” is ezzel a technikával készült.
Most nézzünk meg néhány lehetőséget saját programmal való képkészítésre.
ASCII képek rajzolása programozási alapismeretek tanulásakor
Saját programmal már az alapok tanulásakor készíthetők ASCII képek a vezérlő szerkezetek megismerése kapcsán. Az alábbi képek bemutatják a lehetőségeket.
További sok-sok kép található az alábbi weboldalakon:
- Christopher Johnson’s ASCII Art Collection: https://asciiart.website
- ASCII Art Archive: https://www.asciiart.eu
- ASCII Art Dictionary / Collection: http://www.ascii-art.de/ascii
A 2D grafikával való szövegrajzoláshoz használható BufferedImage osztály
A BufferedImage osztály a java.awt.image csomag része. Az Image osztály utódja. Hozzáférhető képadat-puffert tartalmaz, colorModel-ből és képadatok raster-éből áll. A raster sampleModel-jében a sávok számának és típusainak illeszkedniük kell a színt és átlátszó (alpha) komponenseket megadó colorModel által megkívánt számhoz és típusokhoz. A BufferedImage típusú objektumnak van bal felső koordinátája (0, 0), ezért a létrehozásához használt raster-nek kell legyen minX=0 és minY=0 értéke. A BufferedImage osztály a raster fetch és set metódusaira, valamint a colorModel színmódosítási módszereire támaszkodik.
Szöveg képként megjelenítése karakterekkel a konzolon
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
public class ASCIIArtKep { public static void main(String[] args) { int kepSzelesseg=150, kepMagassag=20; BufferedImage pKep=new BufferedImage( kepSzelesseg, kepMagassag, BufferedImage.TYPE_INT_RGB); Graphics2D kep2D=(Graphics2D)pKep.getGraphics(); kep2D.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON); kep2D.drawString("it-tanfolyam.hu", 5, 10); for(int y=0; y<kepMagassag; y++) { StringBuilder kepEpito=new StringBuilder(); for(int x=0; x<kepSzelesseg; x++) kepEpito.append(pKep.getRGB(x, y)==-16777216?" ":"X"); if(!kepEpito.toString().trim().isEmpty()) System.out.println(kepEpito); } } } |
A kép méretét beállítjuk. A Graphics2D osztály drawString() metódusával String-et képként jeleníthetünk meg. Bár elég „munkás”, de Java-ban gyakran BufferedImage példány létrehozásával oldjuk ezt meg, és a Graphics példányt attól kérjük el. A Graphics2D osztály karakterfüzérek rajzolásakor egyszerű mátrixszerű technikát használ. A String-et kirajzoló mátrixrészek nullától különböző értéket kapnak. A megjelenítendő terület értékét egyszerű adatként, például int-ként kell megadnunk, nem RGB színértékekkel. Ehhez a képtípust int-módba állítottuk: BufferedImage.TYPE_INT_RGB. Az ASCII képek alapötlete az, hogy a képmátrix nem nulla indexeihez hozzárendelt értékeket a kívánt művészi karakterrel helyettesítjük. A nulla értékű mátrixindexeknek szóközt adunk. A nulla integer-módban -16777216-tal egyenlő. Ezután a Java 2D grafika haladó renderelő beállításainak használatához kasztoljuk a Graphics objektumot Graphics2D példánnyá. Majd beállítjuk a kívánt renderelési paramétereket, végül meghívjuk a drawString() metódust egy karakterlánccal.
Íme az elkészült szöveg/képernyőkép:
A karakterek cserélgetésével a pozitív képből könnyen kaphatunk inverz/negatív képet is. A generált/renderelt képet fájlban is tárolhatjuk, például a javax.imageio.ImageIO osztállyal és adott a lehetőség a kép méretének megadására, a rajta megjelenő szöveg betűtípusának beállítására, háttérszín és szövegszín alkalmazására is.
A Java BufferedImage osztály néhány lehetőségének áttekintése után jó szórakozást kívánunk az ASCII képek létrehozásához, a lehetőségek további tanulmányozásához. Aki nem programból szeretne karakterekből/szövegekből felépülő képeket készíteni, használhat online alkalmazásokat is, például az Image to HTML/ASCII-t.
A bejegyzéshez tartozó teljes forráskódot ILIAS e-learning tananyagban tesszük elérhetővé tanfolyamaink résztvevői számára.
A feladat a Java SE szoftverfejlesztő tanfolyam szakmai moduljának 21-24. óra: Objektumorientált programozás, 2. rész alkalmához kötődik.
Szerintem ez a videó hasznos lehet a témához: ASCII Rocket
Ajánlom az AsciiWorld.com gyűjteményt: http://www.asciiworld.com/
Akit érdekel a téma: Text Art, https://fsymbols.com/text-art/
Írtam beszámolót a Vasarely Múzeum látogatásomról: Múzeumok Éjszakája 2023.
Sikerült rajzolnom egy karácsonyfát:
Ezzel a Java forráskóddal:
Köszönöm Zsombor. Ügyesen megoldottad, hogy paraméterezhető legyen a karácsonyfa magassága és véletlenszerű karakterekből épül fel. Precíz az igazítása is. Beszédes a forráskód is. Látszik, hogy kitartóan gyakorolsz. Örülök neki.