画像

last modified: Feb./2nd/2002

ここまでで、アプレットに文字や図形を描画し、フォントを指定できるようになりました。本節では画像を読み込んで表示します。

画像データの取得と表示

手順としては、最初に画像データを java.awt.Image クラス型オブジェクトとして取得 (get) して、これを java.awt.Graphics クラス型オブジェクトにセットします。

画像データの取得

いま、本文書と同じディレクトリに次の画像ファイルが存在します。この文書のためにいま適当に作りました。

サンプル用画像 (image.gif)
図: image.gif

この画像を Image クラス型オブジェクトとして取得します:

Image im = getImage(getDocumentBase(), "image.gif");

getImage() メソッドは Applet クラスで定義されています。

戻り値メソッド働き
ImagegetImage(URL url) 画面に表示できる Image オブジェクトを返します。
ImagegetImage(URL url, String name) 画面に表示できる Image オブジェクトを返します。

URL は絶対 URL (http://~, ftp://~ など)です。通常は基準 URL (Base URL) を指定して、画像ファイ名を文字列で指定します。基準 URL には、 HTML ファイルのパスか、アプレットファイルのパスが使われます。これらの代表的な基準 URL を指定するためのメソッドも Applet クラスで定義されています。

戻り値メソッド働き
URLgetCodeBase() アプレット自身の URL である、基底 URL を取得します。
URLgetDocumentBase() アプレットが組み込まれているドキュメントのディレクトリを命名する絶対 URL を返します。

画像の描画

画像は Graphics クラスの drawImage() メソッドで描画します。

drawImage() メソッドはたくさんオーバーロードされており、引数のとり方は多彩です。最も基本的な引数の組み合わせは次のものです:

drawImage(Image img, int x, int y, ImageObserver observer)
drawImage(Image img, int x, int y, Color bgcolor, ImageObserver observer) 
img
描画する Image クラス型オブジェクト。 getImage() メソッドで作成する。
x, y
描画する領域の左上隅の座標。他のメソッドと同様に、実行アプレットの左上隅が 0, 0 になり、 x 軸は右方向、 y 軸は下方向が正になる。
observer
画像が更新されるときにその情報を通知するオブジェクト。通常は実行されているアプレットがイメージ・オブザーバになっているため、 this を指定することになる。
bgcolor
背景色。画像データの透明部分に透過される。

他にも描画領域の「幅、高さ」を指定するものや、「ソースデータの選択領域とアプレットの描画領域」を指定するものがあります。詳しくは API 仕様の java.awt.Graphics クラスのメソッドの項を参照すると良いでしょう。

サンプル

画像 image.gif を描画するサンプルです。

import java.awt.*;
import java.applet.*;

public class ImageTest extends Applet{

	//アプレットの初期化
	public void init() {
		//アプレットの背景色の指定
		setBackground(new Color(0.8F, 0.8F, 0.9F));
	}

	//描画
	public void paint(Graphics g) {
		
		//画像オブジェクトの作成
		Image bnJava = getImage(getDocumentBase(), "image.gif");
		//画像の描画
		g.drawImage(bnJava, 20, 10, this);
		
		//色オブジェクトの作成
		Color bg = new Color(0.8F, 0.9F, 0.8F);
		//画像の背景色付き描画
		g.drawImage(bnJava, 140, 10, bg, this);

		//画像の幅、高さの指定付き描画
		g.drawImage(bnJava, 20,70, 150,40, this);
		g.drawImage(bnJava, 180,70, 60,100, bg, this);
		
		//画像オブジェクトの作成
		Image ban = getImage(getDocumentBase(), "../nextindexb.jpg");
		//画像の描画
		g.drawImage(ban, 20, 120, this);
	}
}

このソースでは、最後の画像 "nextindexb.jpg" は、アプレットのコードベースよりも上位のディレクトリを指定しています。ローカルで試すと、Java サンドボックスの外のリソースを触りに行くことになり、セキュリティ関連例外がしこたま出て、問題のある画像は読み込むことができず、描画されません。これを解消するには、アプレットに証明書をつけてポリシーで許可します。又は、このページがウェブページから返されれば、エラーは返されず、問題なく出力されます。

C:\java\applet>appletviewer image.html
java.security.AccessControlException: access denied (java.io.FilePermission \C:\java\nextindexb.jpg read)
        at java.security.AccessControlContext.checkPermission(AccessControlContext.java:269)
        at java.security.AccessController.checkPermission(AccessController.java:401)
        at java.lang.SecurityManager.checkPermission(SecurityManager.java:524)
        at java.lang.SecurityManager.checkRead(SecurityManager.java:863)
        ...
<p><applet code="ImageTest.class" width="260" height="180">
アプレットが実行できない場合の代替内容。
</applet></p>
サンプル用画像 (image.gif)
図: image.gif
アプレットが実行できない場合の代替内容。
アプレット:ImageTest.class

このサンプルでは、描画領域の幅と高さを指定したものも含めました。画像データを取得する画像ソースが、指定した幅と高さにスケーリングされていることが確認できます。画像のサイズとは異なる、適当な数値を指定しても、その大きさに併せて伸縮してくれます。

背景色を指定したものの例では、画像ソースの透過領域から透けていることが確認できます。

本サンプルでは扱っていませんが、画像ソースの任意の一部分を切り取って描画する場合でも同様です。



Copyright © 2001 SUGAI, Manabu. All Rights Reserved.