AAで俺の嫁を軽く画像化してみた。

一ヶ月ぶりにこんにちわ。

あずにゃんペロペロ(^ω^)したいです。マジで。

よもや恥もへったくれもなくなってきました。


30過ぎたら自然にやめると思ってんだろう?
30過ぎたらおのずと減ると思ってんだろう?
甘い!甘いぜ!むしろ増える一方なんだぜ!


そんなOver 30 do The 魂あずにゃんをペロペロしたいプログラマ
略してペログラマの俺です。


これの続きです。

アスキーアートを画像化するプログラムを作ってみました。

要はこういうことしたいわけですね。性的にという意味も含めますが。


参考にさせてもらったのはこちら

id:amachangさんのは*.ttfファイルから読み込んでアスキーアート画像を生成していましたが、自分は任意に与えられた文字列から作成してみようと考えたわけです。

import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.awt.Font;
import java.awt.Color;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.awt.RenderingHints;
import javax.imageio.ImageIO;

public class CreateAAImage {
	public static void write(String aa, String fileName){
		try {
			int px = 15;
			String[] args  = aa.split("\n");
			int w = 0;
			for(String s:args){
				if(w < s.length()){
					w = s.length();
				}
			}
			int width = (w + 2) * px / 11 * 5;
			int height = (args.length + 2)* px;
			Font font = new Font("MS PGothic", Font.PLAIN, px);
			BufferedImage image = new BufferedImage(width,height,BufferedImage.TYPE_INT_RGB);
			Graphics2D g = image.createGraphics();
			g.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_LCD_VBGR);
			g.setColor(Color.WHITE);
			g.fillRect(0, 0, image.getWidth(), image.getHeight());
			g.setColor(Color.BLACK);
			g.setFont(font);
			int i = px;
			for(String s:args){
				g.drawString(s,px,i);
				i += px;
			}

//			ImageIO.write(image, "jpg", new File("D:\\"+ fileName +".jpg"));
			ByteArrayOutputStream baos = new ByteArrayOutputStream();
			ImageIO.write(image, "jpg", baos);
			FileOutputStream fos = new FileOutputStream(new File("D:\\"+ fileName +".jpg"));
			fos.write(baos.toByteArray());
		}  catch (Exception e) {
			e.printStackTrace();
		}
	}
}

引数の"String aa"にアスキーアートを入れてやると生成されます。
改行文字を"\n"で決め打ちしているのでそこんとこは適当に変えてみてください。


また、このプログラムでは横幅をなるたけ自動的にあわせるように作ってありますが、プロポーショナルフォントなのでやっぱりAAがはみ出したりしてしまいます。
自動的に調整できるといいんですがそこまでの技術力*1がありません。
調べたんだけどマジでわかんねぇ…。


あと、ファイルに書き出すだけならImageIO#write(RenderedImage im, String formatName, File output)でも十分です。
いずれWebの上でやってみたいと思っているため今回はわざとByteArrayOutputStreamを使った形にしました。
これであとはtoByteArrayでもして、responseで流し込んでやればServletでダウンロードが出来るわけです。


最後に、まあなんだ。
あずにゃん俺の嫁(^ω^)!

*1:こういう方面ではなく、技術的に変態になりたいです、安西先生