Nghệ thuật ASCII trong Java

1. Khái quát chung

Trong bài viết này, chúng ta sẽ thảo luận về việc tạo bản in đồ họa của các ký tự ASCII hoặc Chuỗi trong Java, sử dụng các khái niệm từ hỗ trợ đồ họa 2D của ngôn ngữ.

2. Vẽ chuỗi bằng đồ họa 2D

Với sự trợ giúp của lớp Graphics2D , có thể vẽ một Chuỗi dưới dạng hình ảnh, đạt được khi gọi phương thức drawString () .

Bởi vì Graphics2D là trừu tượng, chúng ta có thể tạo một thể hiện bằng cách mở rộng nó và triển khai các phương thức khác nhau được liên kết với lớp Graphics .

Mặc dù đây là một nhiệm vụ tẻ nhạt, nhưng nó thường được thực hiện bằng cách tạo một cá thể BufferedImage trong Java và truy xuất cá thể Đồ họa cơ bản từ nó:

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

2.1. Thay thế các chỉ số ma trận hình ảnh bằng ký tự ASCII

Khi vẽ Strings, các Graphics2D lớp sử dụng một đơn giản ma trận giống như kỹ thuật nơi vùng mà carve ra các thiết kế Strings được gán một giá trị đặc biệt khi những người khác được đưa ra một giá trị 0.

Để có thể thay thế vùng khắc bằng ký tự ASCII mong muốn, chúng ta cần phát hiện các giá trị của vùng khắc dưới dạng một điểm dữ liệu đơn lẻ (ví dụ: số nguyên) chứ không phải giá trị màu RGB.

Để màu RGB của hình ảnh được biểu thị dưới dạng số nguyên, chúng tôi đặt loại hình ảnh thành chế độ số nguyên:

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

Ý tưởng cơ bản là thay thế các giá trị được gán cho các chỉ số khác 0 của ma trận hình ảnh bằng đặc điểm nghệ thuật mong muốn.

Trong khi các chỉ số của ma trận đại diện cho giá trị 0 sẽ được gán một ký tự khoảng trắng. Tương đương 0 của chế độ số nguyên là -16777216.

3. Trình tạo nghệ thuật ASCII

Hãy xem xét một trường hợp mà chúng ta cần tạo nghệ thuật ASCII cho chuỗi “BAELDUNG”.

Chúng tôi bắt đầu bằng cách tạo một hình ảnh trống với chiều rộng / chiều cao mong muốn và kiểu hình ảnh được đặt ở chế độ số nguyên như đã đề cập trong phần 2.1.

Để có thể sử dụng tùy chọn nâng cao vẽ đồ họa 2D trong Java, chúng tôi đúc của chúng tôi Graphics đối tượng để một Graphics2D dụ . Sau đó, chúng tôi đặt các tham số hiển thị mong muốn trước khi gọi phương thức drawString () với chuỗi “BAELDUNG” :

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

Ở trên, 12 và 24 đại diện tương ứng, tọa độ x và y cho điểm trên hình ảnh nơi bắt đầu in văn bản.

Bây giờ, chúng ta có một đồ họa 2D có ma trận bên dưới chứa hai loại giá trị phân biệt; các chỉ số khác không và không.

Nhưng để chúng ta có được khái niệm, chúng ta sẽ đi qua mảng 2 chiều (hoặc ma trận) và thay thế tất cả các giá trị bằng ký tự ASCII “*” bằng cách:

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

Kết quả của phần trên chỉ hiển thị một khối dấu hoa thị (*) như bên dưới:

Nếu chúng ta phân biệt sự thay thế bằng “*” bằng cách chỉ thay thế các giá trị nguyên bằng -16777216 bằng “*” và phần còn lại bằng ”“:

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

Chúng tôi có được một tác phẩm nghệ thuật ASCII khác tương ứng với chuỗi “BAELDUNG” của chúng tôi nhưng được khắc ngược như thế này:

Cuối cùng, chúng tôi đảo ngược sự phân biệt bằng cách thay thế các giá trị số nguyên bằng -16777216 bằng ”” và phần còn lại bằng “*”:

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

Điều này cung cấp cho chúng tôi một nghệ thuật ASCII của chuỗi mong muốn :

4. Kết luận

Trong hướng dẫn nhanh này, chúng ta đã xem xét cách tạo nghệ thuật ASCII trong Java bằng cách sử dụng thư viện đồ họa 2D có sẵn.

Trong khi chúng tôi đã trình bày cụ thể cho văn bản; “BAELDUNG”, mã nguồn trên Github cung cấp một chức năng tiện ích chấp nhận bất kỳ Chuỗi nào .

Mã nguồn, như mọi khi, có thể được tìm thấy trên GitHub.