ASCII Art בג'אווה

1. סקירה כללית

במאמר זה נדון ביצירת הדפס גרפי של תווי ASCII או מיתרים בג'אווה, תוך שימוש במושגים מהתמיכה הגרפית הדו-ממדית של השפה.

2. מיתרי ציור עם גרפיקה דו-ממדית

בעזרת ה- Graphics2D בכיתה, אפשר לצייר חוּט כתמונה, שהושגה בהפעלת drawString () שיטה.

כי Graphics2D הוא מופשט, אנו יכולים ליצור מופע על ידי הרחבתו ויישום השיטות השונות הקשורות ל- גרָפִיקָה מעמד.

אמנם זו משימה מייגעת, אך לעתים קרובות היא נעשית על ידי יצירת BufferedImage למשל בג'אווה ואחזור בסיסו גרָפִיקָה מופע ממנו:

BufferedImage bufferedImage = BufferedImage חדש (רוחב, גובה, BufferedImage.TYPE_INT_RGB); גרפיקה גרפית = bufferedImage.getGraphics ();

2.1. החלפת מדדי מטריקס תמונה בתו ASCII

בעת ציור מיתרים, ה Graphics2D הכיתה משתמשת בטכניקה פשוטה דמוית מטריצה ​​כאשר אזורים החורצים את המתוכנן מיתרים מוקצה ערך מסוים ואילו לאחרים ניתן ערך אפס.

כדי שנוכל להחליף את האזור המגולף בתו ASCII הרצוי, עלינו לזהות את ערכי האזור המגולף כנקודת נתונים יחידה (למשל מספר שלם) ולא את ערכי הצבע RGB.

כדי להציג את צבע ה- RGB של התמונה כמספר שלם, הגדרנו את סוג התמונה למצב שלם:

BufferedImage bufferedImage = BufferedImage חדש (רוחב, גובה, BufferedImage.TYPE_INT_RGB);

הרעיון הבסיסי הוא להחליף את הערכים המוקצים למדדים שאינם אפסים של מטריצת התמונה באופי האמנותי הרצוי.

בעוד שלמדדי המטריצה ​​המייצגים את הערך האפס יוקצה תו רווח יחיד. המקבילה האפסית למצב המספר השלם היא -16777216.

3. מחולל אמנות ASCII

הבה נבחן מקרה בו עלינו ליצור אומנות ASCII של מחרוזת "BAELDUNG".

אנו מתחילים ביצירת תמונה ריקה עם רוחב / גובה רצוי וסוג התמונה מוגדר למצב שלם כאמור בסעיף 2.1.

כדי להיות מסוגלים להשתמש באפשרויות עיבוד מתקדמות של גרפיקה דו-ממדית בג'אווה, אנו משליכים את גרָפִיקָה התנגדות ל Graphics2D למשל. לאחר מכן הגדרנו את פרמטרי העיבוד הרצויים לפני הפעלת ה- drawString () שיטה עם "BAELDUNG" חוּט:

Graphics2D graphics2D = (Graphics2D) גרפיקה; graphics2D.setRenderingHint (RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON); graphics2D.drawString ("BAELDUNG", 12, 24);

באמור לעיל, 12 ו- 24 מייצגים בהתאמה את הקואורדינטות של x ו- y עבור הנקודה בתמונה ממנה צריך להתחיל הדפסת הטקסט.

כעת, יש לנו גרפיקה דו-ממדית שהמטריצה ​​הבסיסית שלה מכילה שני סוגים של ערכים מופלים; מדדים שאינם אפסים ואפסים.

אך בכדי שנקבל את הרעיון, נעבור דרך המערך הדו-ממדי (או המטריצה) ונחליף את כל הערכים בתו ASCII "*" על ידי:

עבור (int y = 0; y <settings.height; y ++) {StringBuilder stringBuilder = StringBuilder חדש (); עבור (int x = 0; x <settings.width; x ++) {stringBuilder.append ("*"); } אם (stringBuilder.toString (). trim (). isEmpty ()) {המשך; } System.out.println (stringBuilder); }

הפלט של האמור לעיל מראה רק גוש כוכביות (*) כפי שנראה למטה:

אם אנו מפלים את ההחלפה ב- "*" על ידי החלפת ערכי המספר השלם רק ל- -16777216 ב- "*" והשאר ב- "":

עבור (int y = 0; y <settings.height; y ++) {StringBuilder stringBuilder = StringBuilder חדש (); עבור (int x = 0; x <settings.width; x ++) {stringBuilder.append (image.getRGB (x, y) == -16777216? "*": ""); } אם (stringBuilder.toString (). trim (). isEmpty ()) {המשך; } System.out.println (stringBuilder); }

אנו משיגים אומנות ASCII שונה המתאימה למחרוזת שלנו "BAELDUNG" אך בגילוף הפוך כזה:

לבסוף, אנו הופכים את האפליה על ידי החלפת ערכי המספר השלם -16777216 ב- "" והשאר ב- "*":

עבור (int y = 0; y <settings.height; y ++) {StringBuilder stringBuilder = StringBuilder חדש (); עבור (int x = 0; x <settings.width; x ++) {stringBuilder.append (image.getRGB (x, y) == -16777216? "": "*"); } אם (stringBuilder.toString (). trim (). isEmpty ()) {המשך; } System.out.println (stringBuilder); }

זה נותן לנו אמנות ASCII של הרצוי חוּט:

4. מסקנה

במדריך מהיר זה, הסתכלנו כיצד ליצור אמנות ASCII בג'אווה באמצעות ספריית הגרפיקה הדו-ממדית המובנית.

אמנם הצגנו במיוחד עבור הטקסט; "BAELDUNG", קוד המקור ב- Github מספק פונקציית שירות המקבלת כל אחת מהן חוּט.

קוד המקור, כמו תמיד, נמצא ב- GitHub.