画像RSS

2016年9月4日日曜日

画像を出力するJava Servlet

 ウェブサーバに動的に画像を出力させたい場合がある。 リアルタイムで値が変動するデータのグラフを作りたい場合やアクセスカウンターを作りたい場合などがそれである。 グラフはJavaScriptのCanvas 2Dでも実現できなくもないだろうが、JavaScriptはクライアントに依存するため、それだけに頼るのは避けるべきである。SVGというXMLを利用した方法も使えるだろうが、SVGでは不都合な場合もあるだろう。SVGはブラウザによっては対応していないこともあるかもしれない。

 そのため、Java Servletを利用して画像を出力する方法を考えてみた。思いの外簡単であり、誰でも思いつくようなことだろうが一応書いておく。

 画像を出力するにあたってまず必要なことは、HttpServletインスタンスのdoGetメソッド等の引数である HttpServletResponseインスタンスのメソッドsetContentTypeを実行することである。 そのメソッドの引数に"image/png"などの画像の形式 (MIME型) を表す文字列を与えればいい。

 Javaで画像を扱うのに簡単な方法はBufferedImageを使うことである。 コンストラクタで一から生成してもいいし、ImageIOreadメソッドで既存のファイルを鋳型として生成してもいい。BufferedImagegetGraphicsメソッドの返り値のGraphicsインスタンスや、 createGraphicsメソッドの返り値のGraphics2Dインスタンスを利用すれば、画像の変換等を行うことができる。

 画像の処理を行った後、最後にImageIOwriteメソッドを実行する。第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 件のコメント:

コメントを投稿