Seni ASCII di Jawa

1. Ikhtisar

Pada artikel ini, kita akan membahas cara membuat cetakan grafis dari karakter ASCII atau Strings di Java, menggunakan konsep dari dukungan grafis 2D bahasa tersebut.

2. Menggambar String Dengan Grafik 2D

Dengan bantuan kelas Graphics2D , dimungkinkan untuk menggambar String sebagai gambar, dicapai dengan memanggil metode drawString () .

Karena Graphics2D abstrak, kita dapat membuat sebuah instance dengan memperluasnya dan mengimplementasikan berbagai metode yang terkait dengan kelas Graphics .

Meskipun ini adalah tugas yang membosankan, ini sering kali dilakukan dengan membuat instance BufferedImage di Java dan mengambil instance Graphics yang mendasarinya darinya:

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

2.1. Mengganti Indeks Matriks Gambar Dengan Karakter ASCII

Ketika menggambar Strings, yang Graphics2D kelas menggunakan teknik sederhana matriks-seperti di mana daerah yang mengukir dirancang String ditugaskan nilai tertentu sementara yang lain diberi nilai zeroth.

Agar kami dapat mengganti area berukir dengan karakter ASCII yang diinginkan, kami perlu mendeteksi nilai wilayah ukiran sebagai titik data tunggal (misalnya bilangan bulat) dan bukan nilai warna RGB.

Agar warna RGB gambar direpresentasikan sebagai integer, kami menyetel jenis gambar ke mode integer:

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

Ide dasarnya adalah mengganti nilai yang ditetapkan ke indeks bukan nol dari matriks gambar dengan karakter artistik yang diinginkan.

Sedangkan indeks dari matriks yang mewakili nilai nol akan diberi karakter spasi tunggal. Nol yang setara dengan mode integer adalah -16777216.

3. Generator Seni ASCII

Mari pertimbangkan kasus di mana kita perlu membuat seni ASCII dari string "BAELDUNG".

Kita mulai dengan membuat gambar kosong dengan lebar / tinggi yang diinginkan dan tipe gambar diatur ke mode integer seperti yang disebutkan di bagian 2.1.

Untuk dapat menggunakan opsi rendering lanjutan dari grafik 2D di Java, kami mentransmisikan objek Grafik kami ke instance Graphics2D . Kami kemudian menyetel parameter rendering yang diinginkan sebelum menjalankan metode 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 mewakili masing-masing, koordinat x dan y untuk titik pada gambar di mana pencetakan teks harus dimulai.

Sekarang, kami memiliki grafik 2D yang matriks dasarnya berisi dua jenis nilai terdiskriminasi; indeks bukan nol dan nol.

Tetapi bagi kita untuk mendapatkan konsepnya, kita akan melalui array 2 dimensi (atau matriks) dan mengganti semua nilai dengan karakter 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); }

Output di atas hanya menunjukkan sekumpulan tanda bintang (*) seperti yang terlihat di bawah ini:

Jika kita membedakan penggantian dengan “*” dengan hanya mengganti nilai integer yang sama dengan -16777216 dengan “*” dan sisanya 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 mendapatkan seni ASCII yang berbeda yang sesuai dengan string "BAELDUNG" kami, tetapi dalam ukiran terbalik seperti ini:

Terakhir, kami membalikkan diskriminasi dengan mengganti nilai bilangan bulat yang sama dengan -16777216 dengan "" dan sisanya 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 diinginkan :

4. Kesimpulan

Dalam tutorial singkat ini, kami telah melihat cara membuat seni ASCII di Java menggunakan pustaka grafis 2D bawaan.

Sedangkan yang telah kami tampilkan khusus untuk teks; “BAELDUNG”, kode sumber di Github menyediakan fungsi utilitas yang menerima String apa pun .

Kode sumber, seperti biasa, dapat ditemukan di GitHub.