開発 JAVA

【JAVA】文字列の画像化

基本形

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だと日本語が□となってしまい、正常に表示されなかった。

Windowsで実行した場合
Linuxで実行した場合

フォント指定

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フォントを指定した場合(Linux)

アンチエイリアシングの設定

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です。

参考サイト

-開発, JAVA
-, , , ,