ファイルからのイメージのロードと描画


Graphics クラスのメソッドで,drawImage というものがある.Java言語では,イメージ と呼ばれるビットマップ画像データを扱うためのライブラリも用意されている.

イメージは,

  1. ファイルから読み込む
  2. オフスクリーンイメージ
  3. 指定されたURL(Universal Resource Locator)から読み込む
  4. メモリ上の RGB データ
などの方法で生成することができるが,ここでは最初の2種類について試して みる.

イメージに対応する型 Image の説明を見ると,

Image クラスは抽象クラスである。イメージはプラットホーム固有の方法 で得られなければならない。

と書いてある.「抽象クラス」というのは,そのサブクラスをいくつか定義し て,そのサブクラスに属するオブジェクトは作られるが,そのクラスだけに属 するオブジェクトは作られないというものである.

しかし,具体的にどのようなサブクラスが存在するかというのは,プラット ホーム(処理系を実行する環境のこと.具体的には機種,OS,ライブラリなど) 固有である.しかし,Imageクラスを使う側はそれらのサブクラスの存在を意 識しなくても良い.

ファイルからイメージを読み込むときには,AWTの実装に固有な動作をさせる ために使う Toolkit というクラスのgetImageというメソッドを呼ぶ.現在の AWT に 対応する Toolkit クラスのオブジェクトはToolkit.getDefaultToolkit() で 得られるので,イメージを得るには, 「Toolkit.getDefaultToolkit().getImage(ファイル名)」のようにする. getImage では JPEG形式と gif形式の画像ファイルが読み込み可能である.

教育用システムの NC から Unixに入って java 処理系を使う際は, drawImageをおこなうと,色が化けるという致命的なバグが見つかっている. このバグを回避するために,gifファイルの色を化けないように変更するコマ ンド /opt/ECC/bin/gif16bit を作成した.

gif16bit 元のgifファイル > 化けないgifファイル
を実行してできた「化けないgifファイル」はjavaでdrawImageすると,「元の gifファイル」とほとんど同じ色で出る.

例をみてみよう.

  // AWT を使うので,java.awt.* を import する.
import java.awt.*;
// イベント処理をおこなうので,
import java.awt.event.*;

  // 独立したウィンドウを作るので,DrawImageは Frameのサブクラスとして定義
class DrawImage extends Frame implements KeyListener{
    // イメージを表す Image クラスの変数 image の宣言
  Image image;
    // DrawImageクラスのコンストラクタ
  public DrawImage(){
      // 親クラスである Frameクラスのコンストラクタを
      // タイトル文字列を "DrawImage"として呼ぶ.
    super("DrawImage");
      // 現在の Toolkit を得て,getImageで GIF 形式のファイルを指定して,
      // イメージを得る.
    image=Toolkit.getDefaultToolkit().getImage("test.gif");
    addKeyListener(this);
  }
  public static void main(String [] args){
      // DrawImageクラスのインスタンスを作る.
    DrawImage frame=new DrawImage();
      // ウィンドウのサイズを300 x 300 に指定する.
    frame.setSize(300,300);
      // ウィンドウを表示する.
    frame.setVisible(true);
  }
  public void paint(Graphics g){
      // イメージ image を (100,100)を左上にして表示する.
    g.drawImage(image,100,100,this);
      // イメージ image を (100,150)を左上にして,幅80高さ80で表示する.
    g.drawImage(image,100,150,80,80,this);
  }
    // キーを押した際に発生するイベントを以下のメソッドで捕まえる.
  public void keyPressed(KeyEvent e){
    int key=e.getKeyChar();
      // 入力したキーのコードが「q」だった時は終了するl
    if(key=='q') System.exit(0);
  }
  public void keyReleased(KeyEvent e){}
  public void keyTyped(KeyEvent e){}
}
Graphicsクラス のメソッド drawImage には,メソッドpaint中の2つめの 呼び出しのように,もとのイメージを拡大縮小して,表示させる機能もある.

上のプログラムを動かすためには,test.gifという gif 形式の画像ファイル を作る必要がある.教育用計算機センターのシステムでは,gimp, xpaint, xv, display などのコマンドで gif 形式の画像ファイルを作ることができる. センターのシステムで使う時は,gif16bit で変換するのを忘れないように.


オフスクリーンイメージ