JavaのASCIIアート
1概要
この記事では、言語の2Dグラフィックサポートの概念を使用して、JavaでASCII文字または
文字列
をグラフィカルに印刷する方法について説明します。
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__を切り出す領域に特定の値を割り当て、他の領域には0の値を割り当てるという単純な行列のような手法を使います。
彫刻領域を所望のASCII文字で置き換えることができるようにするためには、RGBカラー値ではなく単一のデータ点(例えば整数)として彫刻領域の値を検出する必要がある。
画像のRGBカラーを整数として表現するには、画像タイプを整数モードに設定します。
BufferedImage bufferedImage = new BufferedImage(
width, height,
BufferedImage.TYPE__INT__RGB);
基本的な考え方は、イメージ行列のゼロ以外のインデックスに割り当てられた値を、必要な芸術的文字で置き換えることです。
ゼロ値を表す行列のインデックスには、単一の空白文字が割り当てられます。整数モードのゼロ当量は-16777216です。
3 ASCIIアートジェネレータ
「BAELDUNG」という文字列のASCIIアートを作成する必要がある場合を考えてみましょう。
セクション2.1で述べたように、希望する幅/高さと画像タイプを整数モードに設定した空の画像を作成することから始めます。
Javaで2Dグラフィックスの高度なレンダリングオプションを使用できるようにするために、
Graphics
オブジェクトを
Graphics2D
インスタンスにキャストします。
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);
}
上記の出力は、以下に示すようにアスタリスク(** )のブロックだけを示しています。
リンク:/uploads/baeldung__empty.png%201292w[]
-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アートが得られます。
リンク:/uploads/baeldung__invert.png%201371w[]
最後に、-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アートを与えます:
リンク:/uploads/baeldung.png%201159w[]
4結論
このクイックチュートリアルでは、作り付けの2Dグラフィックライブラリを使ってJavaでASCIIアートを作成する方法を見ました。
私たちは特にテキストのために示しましたが; Githubのソースコード「BAELDUNG」は、任意の
String.
を受け入れるユーティリティ関数を提供します。
ソースコードは、いつものようにhttps://github.com/eugenp/tutorials/tree/master/core-java[over on GitHub]にあります。