Seni ASCII di Jawa

1. Gambaran keseluruhan

Dalam artikel ini, kita akan membincangkan cara membuat cetakan grafik watak ASCII atau String di Java, menggunakan konsep dari sokongan grafik 2D bahasa.

2. Melukis Rentetan Dengan Grafik 2D

Dengan bantuan kelas Graphics2D , mungkin untuk melukis String sebagai gambar, dicapai menggunakan kaedah drawString () .

Oleh kerana Graphics2D bersifat abstrak, kita dapat membuat instance dengan memperluasnya dan menerapkan pelbagai kaedah yang berkaitan dengan kelas Graphics .

Walaupun ini adalah tugas yang membosankan, sering dilakukan dengan membuat contoh BufferedImage di Java dan mengambil contoh Grafik yang mendasarinya :

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

2.1. Menggantikan Indeks Matriks Gambar Dengan Karakter ASCII

Apabila melukis Strings, yang Graphics2D kelas menggunakan yang mudah matriks seperti teknik di mana kawasan-kawasan yang mengukir yang direka Strings ditugaskan nilai tertentu manakala yang lain diberi nilai 0.

Agar kita dapat mengganti kawasan yang diukir dengan watak ASCII yang diinginkan, kita perlu mengesan nilai kawasan yang diukir sebagai titik data tunggal (contohnya bilangan bulat) dan bukan nilai warna RGB.

Untuk menunjukkan warna RGB gambar sebagai bilangan bulat, kami menetapkan jenis gambar ke mod integer:

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

Idea asasnya adalah untuk menggantikan nilai yang diberikan kepada indeks bukan sifar matriks gambar dengan watak artistik yang diinginkan.

Sementara indeks matriks yang mewakili nilai sifar akan diberikan watak ruang tunggal. Setara sifar mod integer ialah -16777216

3. Penjana Seni ASCII

Mari kita pertimbangkan kes di mana kita perlu membuat seni ASCII dari rentetan "BAELDUNG".

Kita mulai dengan membuat gambar kosong dengan lebar / tinggi yang diinginkan dan jenis gambar ditetapkan ke mode integer seperti yang disebutkan di bahagian 2.1.

Untuk dapat menggunakan pilihan rendering lanjutan grafik 2D di Java, kami memasukkan objek Grafik kami ke instance Graphics2D . Kami kemudian menetapkan parameter rendering yang diinginkan sebelum menggunakan kaedah drawString () dengan String "BAELDUNG" :

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

Di atas, 12 dan 24 masing-masing mewakili, koordinat x dan y untuk titik pada gambar dari mana percetakan teks bermula.

Sekarang, kita mempunyai grafik 2D yang matriks dasarnya mengandungi dua jenis nilai diskriminasi; indeks bukan sifar dan sifar.

Tetapi untuk mendapatkan konsepnya, kita akan melalui array 2 dimensi (atau matriks) dan mengganti semua nilai dengan watak ASCII "*" dengan:

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

Keluaran di atas menunjukkan sekumpulan tanda bintang (*) seperti yang dilihat di bawah:

Sekiranya kita membezakan penggantian dengan "*" dengan mengganti hanya nilai integer sama dengan -16777216 dengan "*" dan selebihnya dengan "":

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

Kami memperoleh seni ASCII yang berbeza yang sesuai dengan tali kami "BAELDUNG" tetapi dalam ukiran terbalik seperti ini:

Akhirnya, kami membalikkan diskriminasi dengan menggantikan nilai integer sama dengan -16777216 dengan "" dan selebihnya dengan "*":

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

Ini memberi kita seni ASCII dari String yang diingini :

4. Kesimpulan

Dalam tutorial ringkas ini, kami melihat bagaimana membuat seni ASCII di Java menggunakan pustaka grafik 2D terbina dalam.

Walaupun kami telah menunjukkan khusus untuk teks; "BAELDUNG", kod sumber di Github menyediakan fungsi utiliti yang menerima String apa pun .

Kod sumber, seperti biasa, boleh didapati di GitHub.