ウェブサーバに動的に画像を出力させたい場合がある。 リアルタイムで値が変動するデータのグラフを作りたい場合やアクセスカウンターを作りたい場合などがそれである。 グラフは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 件のコメント:
コメントを投稿