SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

サーバサイドではじめるJavaグラフィック講座

JSP/サーブレットでイメージを生成する

サーバサイドではじめるJavaグラフィック講座 1


サーバサイドにおけるグラフィック利用の基本

 しかし、サーバサイドになると話はちょっと変わってきます。なぜなら、サーバサイドでは、AWTのようなGUIのための機能は用いられないからです。アプレットなどを作成するのであれば別ですが、サーバ側でグラフィックを利用する場合、基本は「イメージを何らかの形で作成し、それをクライアントに送信して表示させる」という形になるでしょう。

 アプレットのようにAWTなどのGUIで表示する場合と違い、サーブレットの場合には最低でも以下の作業を行うだけの知識が必要となります。

  1. グラフィックを描画するためのイメージオブジェクトの作成
  2. サーバサイドではアプレットなどのように画面に表示される部分があらかじめ用意されているわけではありませんから、まずは「何にグラフィックを描けばよいか」ということから考えねばなりません。一般にグラフィックの描画は、Image/BufferedImageといったクラスのインスタンスを用意してこれに行います。
  1. 用意したイメージオブジェクトからのGraphicsの取得
  2. これにより、取り出したGraphicsを介してイメージオブジェクトに描画を行うことができるようになります。
  1. イメージオブジェクトの送信
  2. 描画したイメージオブジェクトは、そのままでは何も表示されません。クライアント側に、何らかのフォーマットのグラフィックデータとして送信して、初めてブラウザなどに表示されることになります。

 では、先のアプレットで作成したのと同じグラフィックイメージを表示するサーブレットをサンプルとして作ってみましょう。

SampleGraphics.java
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) {}
        }
    }

}
web.xml
<?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/j2ee 
http://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>
表示用のHTMLサンプル
<!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>
Webブラウザから表示用のHTMLにアクセスしたところ。表示されているグラディエーションイメージが、サーブレットにより生成され送られてきたイメージデータ。
Webブラウザから表示用の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を指定しています。

次のページ
GraphicsとGraphics2D

この記事は参考になりましたか?

サーバサイドではじめるJavaグラフィック講座連載記事一覧

もっと読む

この記事の著者

掌田 津耶乃(ショウダ ツヤノ)

三文ライター&三流プログラマ。主にビギナーに向けたプログラミング関連の執筆を中心に活動している。※現在、入門ドキュメントサイト「libro」、カード型学習サイト「CARD.tuyano.com」を公開...

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/978 2007/12/25 10:15

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー