JavaのASCIIアート

JavaのASCIIアート

1. 概要

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

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

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

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を作成する領域に特定の値が割り当てられ、他の領域には0番目の値が割り当てられる単純な行列のような手法を使用します。

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

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

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

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

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

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

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

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

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

Graphics2D graphics2D = (Graphics2D) graphics;
graphics2D.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING,
  RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
graphics2D.drawString("example", 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);
}

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

image

 

置換を「” by replacing only the integer values equal to -16777216 with “」で区別し、残りを「」で区別する場合:

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

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

image

最後に、-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);
}

これにより、目的のString:のASCIIアートが得られます

image

 

4. 結論

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

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

ソースコードは、いつものように、over on GitHubで見つけることができます。