SSブログ

マルチラインな文字列の描画 [ソフトウェア開発のようななにか]

drawString で改行できなくてムッキーしてたけどできた!
以下サンプル。

import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics2D;
import java.awt.font.FontRenderContext;
import java.awt.font.LineBreakMeasurer;
import java.awt.font.TextAttribute;
import java.awt.font.TextLayout;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.text.AttributedString;

import javax.imageio.ImageIO;

public class DrawMultilineString {
	/**
	 * 改行コード
	 */
	public static final String LINE_SEPARATOR = System
			.getProperty("line.separator");

	/**
	 * 実行メソッド
	 * 
	 * @param args
	 *            今回は使用しない
	 * @throws IOException
	 *             画像の読み書きに失敗した場合
	 */
	public static void main(String[] args) throws IOException {
		// 出力する文字列
		String text = "01234567890123456789012345678901\r\n12345678901234567890もいもいこでもいもい";

		// この画像の上に文字を出力するよ
		BufferedImage bufferedImage = ImageIO.read(new File("template.png"));

		// 文字列を書きだす位置
		float y = 30;
		float x = 30;

		// 文字列を書きだす領域の幅だよ
		float wrappingWidth = bufferedImage.getWidth() - (x * 2);

		// テキストとテキストの属性を保持するクラスだよ
		AttributedString as = new AttributedString(text);

		// 属性つけるよ!
		as.addAttribute(TextAttribute.FONT, new Font("MS ゴシック", Font.PLAIN, 15));
		as.addAttribute(TextAttribute.FOREGROUND, Color.BLACK);
		as.addAttribute(TextAttribute.BACKGROUND, new Color(0, 0, 0, 0));

		Graphics2D g2 = bufferedImage.createGraphics();

		// 物差しさんが欲しがる情報は俺が持ってる
		FontRenderContext context = g2.getFontRenderContext();
		// 私が物差しです
		LineBreakMeasurer measurer = new LineBreakMeasurer(as.getIterator(),
				context);

		int position;

		// 文字列の最後まで
		while ((position = measurer.getPosition()) < text.length()) {
			// 行のレイアウト
			TextLayout layout;

			// 改行してる?
			int indexOf = text.indexOf(LINE_SEPARATOR, position);

			// してる
			if (position < indexOf) {
				// 改行位置の手前の分までレイアウトもってくる
				layout = measurer.nextLayout(wrappingWidth, indexOf, false);
			}
			// してない
			else {
				// 自動で折り返してるとこまでレイアウト持ってくる
				layout = measurer.nextLayout(wrappingWidth);
			}

			// レイアウトとれなかった
			if (layout == null) {
				break;
			}

			// Y座標を更新(さっきの位置をベースラインの上として、ベースラインに合わせる)
			y += layout.getAscent();
			// 右寄せだったらX座標を更新
			float dx = layout.isLeftToRight() ? 0 : (wrappingWidth - layout
					.getAdvance());
			// 文字列を書きだす
			layout.draw(g2, x + dx, y);
			// Y座標を更新(ベースラインの下 + 行間)
			y += layout.getDescent() + layout.getLeading();
		}

		// 書き出し
		ImageIO.write(bufferedImage, "png", new File("sample.png"));
	}
}


これが背景に使った画像
201111190047_template.png

これが実行結果
201111190048_sample.png

参考資料


タグ:解決 Java2D Java
nice!(0)  コメント(0)  トラックバック(0) 

nice! 0

コメント 0

コメントを書く

お名前:
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

トラックバック 0

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。