last modified: Feb./2nd/2002
ここまでで、アプレットに文字や図形を描画し、色とフォントを指定できるようになりました。本節では画像を読み込んで表示します。
手順としては、最初に画像データを java.awt.Image クラス型オブジェクトとして取得 (get) して、これを java.awt.Graphics クラス型オブジェクトにセットします。
いま、本文書と同じディレクトリに次の画像ファイルが存在します。この文書のためにいま適当に作りました。
![]() |
図: image.gif |
この画像を Image クラス型オブジェクトとして取得します:
Image im = getImage(getDocumentBase(), "image.gif");
getImage() メソッドは Applet クラスで定義されています。
| 戻り値 | メソッド | 働き |
|---|---|---|
Image | getImage(URL url) |
画面に表示できる Image オブジェクトを返します。 |
Image | getImage(URL url, String name) |
画面に表示できる Image オブジェクトを返します。 |
URL は絶対 URL (http://~, ftp://~ など)です。通常は基準 URL (Base URL) を指定して、画像ファイ名を文字列で指定します。基準 URL には、 HTML ファイルのパスか、アプレットファイルのパスが使われます。これらの代表的な基準 URL を指定するためのメソッドも Applet クラスで定義されています。
| 戻り値 | メソッド | 働き |
|---|---|---|
URL | getCodeBase() |
アプレット自身の URL である、基底 URL を取得します。 |
URL | getDocumentBase() |
アプレットが組み込まれているドキュメントのディレクトリを命名する絶対 URL を返します。 |
画像は Graphics クラスの drawImage() メソッドで描画します。
drawImage() メソッドはたくさんオーバーロードされており、引数のとり方は多彩です。最も基本的な引数の組み合わせは次のものです:
drawImage(Image img, int x, int y, ImageObserver observer) drawImage(Image img, int x, int y, Color bgcolor, ImageObserver observer)
imgImage クラス型オブジェクト。 getImage() メソッドで作成する。x, y0, 0 になり、 x 軸は右方向、 y 軸は下方向が正になる。observerthis を指定することになる。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 |
アプレット:ImageTest.class |
このサンプルでは、描画領域の幅と高さを指定したものも含めました。画像データを取得する画像ソースが、指定した幅と高さにスケーリングされていることが確認できます。画像のサイズとは異なる、適当な数値を指定しても、その大きさに併せて伸縮してくれます。
背景色を指定したものの例では、画像ソースの透過領域から透けていることが確認できます。
本サンプルでは扱っていませんが、画像ソースの任意の一部分を切り取って描画する場合でも同様です。