ウェブサーバに動的に画像を出力させたい場合がある。 リアルタイムで値が変動するデータのグラフを作りたい場合やアクセスカウンターを作りたい場合などがそれである。 グラフはJavaScriptのCanvas 2Dでも実現できなくもないだろうが、JavaScriptはクライアントに依存するため、それだけに頼るのは避けるべきである。SVGというXMLを利用した方法も使えるだろうが、SVGでは不都合な場合もあるだろう。SVGはブラウザによっては対応していないこともあるかもしれない。
そのため、Java Servletを利用して画像を出力する方法を考えてみた。思いの外簡単であり、誰でも思いつくようなことだろうが一応書いておく。
画像を出力するにあたってまず必要なことは、HttpServletインスタンスのdoGetメソッド等の引数である HttpServletResponseインスタンスのメソッドsetContentTypeを実行することである。 そのメソッドの引数に"image/png"などの画像の形式 (MIME型) を表す文字列を与えればいい。
Javaで画像を扱うのに簡単な方法はBufferedImageを使うことである。 コンストラクタで一から生成してもいいし、ImageIOのreadメソッドで既存のファイルを鋳型として生成してもいい。BufferedImageの getGraphicsメソッドの返り値のGraphicsインスタンスや、 createGraphicsメソッドの返り値のGraphics2Dインスタンスを利用すれば、画像の変換等を行うことができる。
画像の処理を行った後、最後にImageIOのwriteメソッドを実行する。第1の引数に処理を行ったBufferedImageのインスタンスを指定する。 第2の引数は"PNG"や"JPEG"等の画像の形式を表す文字列とする。 HttpServletResponseインスタンスのメソッドgetOutputStreamの返り値を第3の引数とする。 こうして、画像が出力される。
public class ImageDrawer extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("image/png");
BufferedImage img=new BufferedImage(200,200,BufferedImage.TYPE_INT_ARGB);
Graphics g=img.getGraphics();
g.setColor(Color.BLACK);
g.fillRect(0,0,200,200);
g.setColor(Color.WHITE);
g.setFont(new Font("梅明朝",Font.BOLD,30));
g.drawString("0123456789",0,30);
g.drawLine(0,0,200,200);
OutputStream os=response.getOutputStream();
ImageIO.write(img,"PNG",os);
}
}上記のコードを実行すれば、このような画像が出力されるはずである。

0 件のコメント:
コメントを投稿