基本形
Graphicsクラスを用いることで文字列を画像化することができる。
フォントを指定していないため、OS標準のフォントが指定される。
import java.awt.Color;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
public class TestImage {
public static void main(String[] args) {
try {
//画像サイズの設定
BufferedImage img = new BufferedImage(240, 240, BufferedImage.TYPE_3BYTE_BGR);
Graphics g = img.getGraphics();
//背景色
g.setColor(Color.WHITE);
g.fillRect(0, 0, 240, 240);
//文字色
g.setColor(Color.BLACK);
g.drawString("これはテストです。1234567890", 15, 15);
g.dispose();
//BMP形式で書き込み
ImageIO.write(img, "bmp", new File("./test.bmp"));
} catch (IOException e) {
// TODO 自動生成された catch ブロック
e.printStackTrace();
}
}
}
ただ、上記で行うとWindows版では正常に画像化できるが、LinuxのOpenJDKだと日本語が□となってしまい、正常に表示されなかった。
フォント指定
Linuxでは□ □ □ □ □ □ になる理由はデフォルトフォントが日本語に対応していないからだと思われる。
そのため、Fontクラスを用いてフォントの指定を指定してあげればよい。
日本語フォントではIPAフォントが有名なのでyumでインストール
yum install ipa-gothic-fonts ipa-pgothic-fonts
Fontクラスでどのフォントを使用するのかを指定し、Graphicsクラスに設定してあげればOK
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
public class TestImage {
public static void main(String[] args) {
try {
String[] formatArray = ImageIO.getWriterFormatNames();
System.out.println("formatType");
for (String format : formatArray) {
System.out.println(format);
}
String[] mimeArray = ImageIO.getWriterMIMETypes();
System.out.println("formatMime");
for (String mime : mimeArray) {
System.out.println(mime);
}
//画像サイズの設定
BufferedImage img = new BufferedImage(240, 240, BufferedImage.TYPE_3BYTE_BGR);
Graphics g = img.getGraphics();
//背景色
g.setColor(Color.WHITE);
g.fillRect(0, 0, 240, 240);
//フォントの設定
Font font = new Font("IPAGothic", Font.PLAIN, 12);
g.setFont(font);
//文字色
g.setColor(Color.BLACK);
g.drawString("これはテストです。1234567890", 15, 15);
g.dispose();
//BMP形式で書き込み
ImageIO.write(img, "bmp", new File("./testaaaaaaaa.bmp"));
} catch (IOException e) {
// TODO 自動生成された catch ブロック
e.printStackTrace();
}
}
}
上記Javaで実行してみると以下のような画像が出来上がる。
しかし、少し画像が荒く見えてしまう・・・
アンチエイリアシングの設定
IPAフォントにはビットマップフォントも埋め込まれており、Javaで出力した場合優先的に表示される模様。
滑らかな文字を出力したい場合はアンチエイリアシングの設定をすればよさそうです。
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
public class TestImage {
public static void main(String[] args) {
try {
String[] formatArray = ImageIO.getWriterFormatNames();
System.out.println("formatType");
for (String format : formatArray) {
System.out.println(format);
}
String[] mimeArray = ImageIO.getWriterMIMETypes();
System.out.println("formatMime");
for (String mime : mimeArray) {
System.out.println(mime);
}
//画像サイズの設定
BufferedImage img = new BufferedImage(480, 240, BufferedImage.TYPE_3BYTE_BGR);
Graphics g = img.getGraphics();
//アンチエイリアシングの有効化設定(文字列)
Graphics2D g2 = (Graphics2D)g;
g2.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
//背景色
g.setColor(Color.WHITE);
g.fillRect(0, 0, 480, 240);
//フォントの設定
Font font = new Font("IPAGothic", Font.PLAIN, 16);
g.setFont(font);
//文字色
g.setColor(Color.BLACK);
g.drawString("これはテストです。1234567890", 15, 15);
g.dispose();
//BMP形式で書き込み
ImageIO.write(img, "bmp", new File("./testaaaaaaaa.bmp"));
} catch (IOException e) {
// TODO 自動生成された catch ブロック
e.printStackTrace();
}
}
}
サンプルでは少しフォントサイズおよび画像サイズを変更しています。
アンチエイリアシングを付けることで文字がくっきり見えるようになりますね。
線・図形にもアンチエイリアシングを適用したい場合は
g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
をつければOKです。