Previous | Next | Trail Map | Creating a User Interface | グラフィックスを扱う


イメージをロードする

このページでは、1 つのイメージに対応する Image オブジェクトを取り出す方法を 説明する。 イメージデータが GIF か JPEG 形式であり、そのファイル名か URL がわかっていれ ば、Image オブジェクトの取り出しは簡単である。Applet または Toolkit の getImage() メソッドのどれかを使用するだけでよい。 getImage() メソッドは、イメージデータが存在するかどうかチェック せずにすぐに戻るようになっている。 イメージデータの実際のロードは通常、プログラムが最初にそのイメージを描こうとするまで開始されない。

多くのプログラムでは、このような目に見えないバックグラウンドローディングが問 題なく動作する。 しかし、イメージローディングの進行状況を把握する必要のあるプログラムも一部に はある。 このページでは、MediaTracker クラスと ImageObserver インタフェースを使って、 進行状況を把握する方法を説明する。

このページの最後では、MemoryImageSource のようなクラスを使って、動きのあるイメージを作成する方法について説明する。

getImage() メソッドを使用する

このセクションでは、まず Applet の getImage() メソッド、次に Toolkit の getImage() メソッドについて説明する。

Applet クラスには 2 つの getImage() メソッドが用意されている。

Applet の getImage() メソッドを使用できるのはアプレットだけであ る。 さらに、Applet の getImage() メソッドは、アプレットが完全なコン テキスト (AppletContext) をもつまで機能しない。 このため、これらのメソッドは、コンストラクタまたはインスタンス変数を宣言する 文から呼び出された場合は機能しない のである。 したがって、getImage() メソッドは init()のようなメ ソッドから呼び出すべきである。

次のコード例では、Applet の getImage() メソッドの使用方法を示す 。 getCodeBase()getDocumentBase() メソッドの解説 については、 GUI を作成する を参照 する。

//Applet サブクラスのメソッドで:
Image image1 = getImage(getCodeBase(), "imageFile.gif");
Image image2 = getImage(getDocumentBase(), "anImageFile.jpeg");
Image image3 = getImage(new URL("http://java.sun.com/graphics/people.gif"));

Toolkit クラスはあと 2 つの getImage() メソッドを宣言している。

Toolkit オブジェクトは、Toolkit の getDefaultToolkit() クラスメ ソッドを起動するか、または Component の getToolkit() インスタン スメソッドを起動することによって獲得することができる。 Component の getToolkit() メソッドは、その Component の実装に使 用された (あるいは使用される予定の) ツールキットを返す。

ここで、Toolkit の getImage() メソッドを使用した例を示す。 すべての Java アプリケーションとアプレットは、通常のセキュリティ制約を受ける アプレットと合わせて、これらのメソッドを使用することができる。 アプレットのセキュリティについては、 アプレットの能力と制約事項を理解 するに記載されている。

Toolkit toolkit = Toolkit.getDefaultToolkit();
Image image1 = toolkit.getImage("imageFile.gif");
Image image2 = toolkit.getImage(new URL("http://java.sun.com/graphics/people.gif"));

イメージローディングを要求し、追跡する: MediaTracker と ImageObserver

AWT はイメージローディングを追跡する方法を 2 つ用意している。1 つは MediaTracker クラス、もう 1 つは ImageObserver インタフェースであ る。 MediaTracker クラスは多くのプログラムに対応できる能力を備えている。ユーザは 、 MediaTracker インスタンスを作成し、それに 1 つ以上のイメージを追跡するよう指 示し、必要に応じてそれらのイメージの状態を MediaTracker に問い合わせるだけで よい。 イメージ動画の外観とパフォーマンスを向上させ るで例が解説されている。

この動画例には、特に便利な MediaTracker の 2 つの機能が示されている。1 つは イメージのグループのデータをロードするよう要求すること、もう 1 つはイメージ のグループがロードされるのを待機することである。 イメージのグループに対するイメージデータをロードするよう要求するには、論理型 の引数をとる checkID()checkAll() の書式を使用 することができる。 論理型引数を true に設定すると、まだロードされていないイメージ のデータのローディングが開始される。 あるいは、waitForID()waitForAll() メソッドを使 用すれば、イメージデータのロードとその待機を要求することができる。

ImageObserver インタフェースでは、MediaTracker よりもさらに細かくイメージロ ーディングを追跡できる。 Component クラスは、コンポーネントが表示するイメージのロードに応じてリペイン トされるようにこのインタフェースを使用する。 ImageObserver インタフェースを使用するには、ImageObserver の imageUpdate() メソッドを実装し、実装するオブジェクトがイメージ オブザーバとして登録されるようにする。 この登録は通常、次のページで説明するように、ユーザが drawImage メソッドに ImageObserver を指定したときに行われる。 imageUpdate() メソッドは、イメージに関する情報が参照可能になる たびに呼び出される。

ここで、ImageObserver インタフェースの imageUpdate() メソッドを 実装する例を示す。 この例は ImageUpdate() を使い、2 つのイメージのサイズがわかると ただちにそれらの位置を決め、両方のイメージがロードされるまで 100 ミリ秒ごと にリペイントを行う。 (プログラム全体も参照できる。)

public boolean imageUpdate(Image theimg, int infoflags,
                           int x, int y, int w, int h) {
    if ((infoflags & (ERROR)) != 0) {
        errored = true;
    }
    if ((infoflags & (WIDTH | HEIGHT)) != 0) {
        positionImages();
    }
    boolean done = ((infoflags & (ERROR | FRAMEBITS | ALLBITS)) != 0);
    // 終了していればただちにリペイントすし、そうでなければ
    // 100 ミリ秒ごとのリペイント要求をバッチする。
    repaint(done ? 0 : 100);
    return !done; //終了すれば、それ以上の更新は必要ない。
}

MediaTracker の API マニュアルを表示すると、Component クラスが checkImageprepareImage() という 2 つの便利そう なメソッドを定義しているのがわかる。 MediaTracker クラスはこれらのメソッドを不必要に大きくしてしまっている。

MemoryImageSource を使用してイメージを作成する

MemoryImageSource クラスのようなイメ ージプロデューサを利用すると、ゼロからイメージを作成することができる。 次のコード例は、X 軸に沿って黒から青までフェードし、Y 軸に沿って黒から赤まで フェードする、100x100 のイメージを計算している。

int w = 100;
int h = 100;
int[] pix = new int[w * h];
int index = 0;
for (int y = 0; y < h; y++) {
    int red = (y * 255) / (h - 1);
    for (int x = 0; x < w; x++) {
          int blue = (x * 255) / (w - 1);
          pix[index++] = (255 << 24) | (red << 16) | blue;
    }
}
Image img = createImage(new MemoryImageSource(w, h, pix, 0, w));


Previous | Next | Trail Map | Creating a User Interface | グラフィックスを扱う