1. 概要

この記事では、言語の2Dグラフィックスサポートの概念を使用して、ASCII文字または文字列のグラフィックプリントをJavaで作成する方法について説明します。

2. 2Dグラフィックスで文字列を描画する

Graphics2D クラスを使用すると、 String を画像として描画し、 drawString()メソッドを呼び出すことができます。

Graphics2D は抽象的であるため、インスタンスを拡張し、Graphicsクラスに関連付けられたさまざまなメソッドを実装することでインスタンスを作成できます。

これは面倒な作業ですが、多くの場合、Javaに BufferedImage インスタンスを作成し、その基になるGraphicsインスタンスを取得することで実行されます。

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

2.1. 画像マトリックスインデックスをASCII文字に置き換える

Strings、を描画する場合、 Graphics2D クラスは、設計された Strings を切り出す領域に特定の値が割り当てられ、他の領域にはゼロ番目の値。

刻まれた領域を目的のASCII文字に置き換えることができるようにするには、刻まれた領域の値を単一のデータポイントとして検出する必要があります(例: 整数)であり、RGBカラー値ではありません。

画像のRGBカラーを整数で表すには、画像タイプを整数モードに設定します。

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

基本的な考え方は、画像マトリックスのゼロ以外のインデックスに割り当てられた値を、目的の芸術的特性に置き換えることです。

一方、ゼロ値を表す行列のインデックスには、単一のスペース文字が割り当てられます。 整数モードに相当するゼロは-16777216です。

3. ASCIIアートジェネレータ

「BAELDUNG」文字列のASCIIアートを作成する必要がある場合を考えてみましょう。

セクション2.1で説明したように、目的の幅/高さで画像タイプを整数モードに設定した空の画像を作成することから始めます。

Javaで2Dグラフィックスの高度なレンダリングオプションを使用できるようにするために、 GraphicsオブジェクトをGraphics2Dインスタンスにキャストします。次に、目的のレンダリングを設定します。 「BAELDUNG」String:を使用して drawString()メソッドを呼び出す前のパラメーター

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

上記で、12と24はそれぞれ、テキスト印刷を開始する画像上のポイントのx座標とy座標を表します。

これで、基礎となる行列に2種類の識別された値が含まれる2Dグラフィックスができました。 非ゼロおよびゼロのインデックス。

ただし、概念を理解するために、2次元配列(または行列)を調べて、すべての値を次のようにASCII文字「*」に置き換えます。

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

上記の出力は、以下に示すように、アスタリスク(*)のブロックのみを示しています。

 

-16777216に等しい整数値のみを「*」に置き換え、残りを「」に置き換えることで、「*」による置換を区別する場合:

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

文字列「BAELDUNG」に対応する別のASCIIアートを取得しますが、次のような反転彫刻を使用します。

最後に、-16777216に等しい整数値を「」に置き換え、残りを「*」に置き換えることで、識別を反転します。

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

これにより、目的の文字列:のASCIIアートが得られます。

 

4. 結論

このクイックチュートリアルでは、組み込みの2Dグラフィックライブラリを使用してJavaでASCIIアートを作成する方法を確認しました。

特にテキストのために示しましたが、 「BAELDUNG」、Githubのソースコードは、任意の文字列を受け入れるユーティリティ関数を提供します。

ソースコードは、いつものように、GitHubにあります。