サーバサイドにおけるグラフィック利用の基本
しかし、サーバサイドになると話はちょっと変わってきます。なぜなら、サーバサイドでは、AWTのようなGUIのための機能は用いられないからです。アプレットなどを作成するのであれば別ですが、サーバ側でグラフィックを利用する場合、基本は「イメージを何らかの形で作成し、それをクライアントに送信して表示させる」という形になるでしょう。
アプレットのようにAWTなどのGUIで表示する場合と違い、サーブレットの場合には最低でも以下の作業を行うだけの知識が必要となります。
- グラフィックを描画するためのイメージオブジェクトの作成
Image/BufferedImageといったクラスのインスタンスを用意してこれに行います。- 用意したイメージオブジェクトからのGraphicsの取得
Graphicsを介してイメージオブジェクトに描画を行うことができるようになります。- イメージオブジェクトの送信
では、先のアプレットで作成したのと同じグラフィックイメージを表示するサーブレットをサンプルとして作ってみましょう。
package jp.tuyano.codezine; import java.awt.*; import java.awt.image.BufferedImage; import java.io.IOException; import javax.imageio.*; import javax.imageio.stream.ImageOutputStream; import javax.servlet.*; import javax.servlet.http.*; public class SampleGraphics extends HttpServlet implements Servlet { private static final long serialVersionUID = 1L; public SampleGraphics() { super(); } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { this.doAction(request, response); } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { this.doAction(request, response); } public void doAction(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // イメージの作成 BufferedImage im = new BufferedImage(256,256, BufferedImage.TYPE_INT_RGB); Graphics g = im.createGraphics(); for(int i = 0;i < 16;i++) for(int j = 0;j < 16;j++){ Color c = new Color(i * 16,0,255 - j * 16); g.setColor(c); g.fillRect(i * 16, j * 16, 16, 16); } g.dispose(); // イメージの出力 ServletOutputStream sos = null; try { response.setContentType("image/jpeg"); sos = response.getOutputStream(); ImageOutputStream ios = ImageIO.createImageOutputStream(sos); ImageWriter iw = (ImageWriter)ImageIO. getImageWritersByFormatName("jpeg").next(); iw.setOutput(ios); iw.write(im); } catch(IOException ex) { } finally { try { sos.close(); } catch(IOException ex2) {} } } }
<?xml version="1.0" encoding="UTF-8"?> <web-app id="WebApp_ID" version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2eehttp://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"> <display-name>sampleWeb</display-name> <servlet> <display-name>SampleGraphics</display-name> <servlet-name>SampleGraphics</servlet-name> <servlet-class>jp.tuyano.codezine.SampleGraphics</servlet-class> </servlet> <servlet-mapping> <servlet-name>SampleGraphics</servlet-name> <url-pattern>/graphics</url-pattern> </servlet-mapping> </web-app>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=windows-31j"> <title>イメージ表示のサンプル</title> </head> <body> ※サーブレットで作ったイメージ<br><br> <img src="./graphics"> </body> </html>

ここではSampleGraphicsというサーブレットを作成し、graphicsというURLパターンで公開するようにしておきました。表示用のHTMLにアクセスすると、SampleGraphicsサーブレットで生成したイメージが<img>タグによってはめ込まれ、表示されます。サーブレットによりイメージが作成され、送られていることが確認できるでしょう。
BufferedImageを使ったイメージの作成
では、それぞれの作業の手順について整理していきましょう。まずは、イメージの作成部分についてです。これは、doActionメソッドの前半で行なっています。
BufferedImage im = new BufferedImage(256,256,
BufferedImage.TYPE_INT_RGB);
サーバサイドでビットマップイメージを作成する場合、通常はBufferedImageインスタンスを作成して、これに描画を行います。このBufferedImageは、次のような形でインスタンスを作成することができます。
new BufferedImage(int width, int height, int imageType)
縦横の幅は分かるでしょう。ドット数を示すint値を渡すだけです。問題は、3つ目のパラメータです。これは、イメージタイプを示すint値を指定します。BufferedImageには、イメージタイプの種類を示すクラスフィールドがいくつか用意されており、通常はそれらを使って指定をします。用意されているフィールドは次のとおりです。
TYPE_INT_RGB TYPE_INT_ARGB TYPE_INT_ARGB_PRE TYPE_INT_BGR TYPE_3BYTE_BGR TYPE_4BYTE_ABGR TYPE_4BYTE_ABGR_PRE TYPE_BYTE_GRAY TYPE_USHORT_GRAY TYPE_BYTE_BINARY TYPE_BYTE_INDEXED TYPE_USHORT_565_RGB TYPE_USHORT_555_RGB
これらの内、一般的なカラーイメージを作成するのであれば、TYPE_INT_RGBまたはTYPE_INT_ARGBを指定するのが普通でしょう。これらの違いは、前者がRGBによる指定であるのに対し、後者はそれにアルファチャンネル(透過度の情報)が追加されたものである、という点です。ここではTYPE_INT_RGBを指定しています。

http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">