一部分を指定の領域内に画像表示

広告

今度は元の画像の一部分を指定の大きさにして表示させてみます。例えば高速読み込みのために複数の画像を1つの画像にまとめてしまい、その中から任意の位置の画像を取り出して表示するといったことも可能になります。

指定されたイメージの指定された領域の利用可能な部分を描きます。指定された
領域の内部に収まるようにただちにスケーリングされ描かれます。透明ピクセル
は、そこにすでに存在するどのようなピクセルにも影響しません。

このメソッドは、描画されるイメージ領域が現在の出力デバイスに対してスケー
リング済み、ディザリング済み、変換済みでなくても、すべての場合にただちに
復帰します。現在の出力表現がまだ完全でない場合、drawImage はfalse を返し
ます。より多くのイメージが利用可能になると、イメージをロードするプロセス
により指定のイメージオブザーバに通知されます。

このメソッドは常にスケーリングされていないイメージを使って、スケーリング
された矩形を描いて、必要なスケーリングをただちに実行します。これはこの操
作に対しては、キャッシュされたスケーリング済みのイメージを使用しません。
ソース矩形の最初の座標をデスティネーション矩形の最初の座標に、ソースの 
2 番目の座標をデスティネーションの 2 番目の座標にといった対応でマッピン
グして、ソースからデスティネーションへのイメージのスケーリングを実行しま
す。サブイメージは、その割り当てを維持する必要性に応じ、スケーリングされ
反転されます。

パラメータ:
  img - 描画される指定イメージ。img が null の場合には何も行わない
  dx1 - デスティネーション矩形の最初の隅の x 座標
  dy1 - デスティネーション矩形の最初の隅の y 座標
  dx2 - デスティネーション矩形の 2 番目の隅の x 座標
  dy2 - デスティネーション矩形の 2 番目の隅の y 座標
  sx1 - ソース矩形の最初の隅の x 座標
  sy1 - ソース矩形の最初の隅の y 座標
  sx2 - ソース矩形の 2 番目の隅の x 座標
  sy2 - ソース矩形の 2 番目の隅の y 座標
  observer - イメージがさらにスケーリングされ、変換されることを通知する
    オブジェクト 
戻り値:
  イメージピクセルがまだ変更中の場合は false、そうでない場合は true

引数に指定したImageクラスのオブジェクトの元になっている画像の(sx1, sy1)を左上、(sx2, sy2)を右下とする部分を切り出し、(dx1, dy1)を左上、(dx2, dy2)を右下となるような領域に調整されて表示されます。

サンプルプログラム

では実際に試してみましょう。元の大きさの一部分を幅20ピクセル、高さ20ピクセルの分だけ切り出し、2倍の大きさぐらいになるように表示してみます。

ImageTest4.java

import java.applet.Applet;
import java.awt.Graphics;
import java.awt.Image;

/*
<applet code="ImageTest4.class" codebase="class" width="150" height="150">
</applet>
*/

public class ImageTest4 extends Applet{
  Image img;

  public void init(){
    img = getImage(getCodeBase(), "../img/reo1s.gif");
  }

  public void paint(Graphics g){
    g.drawImage(img, 10, 10, 50, 50, 20, 20, 40, 40, this);
  }
}

実際にブラウザで見てみると下記のようになります。

※今回使わせて頂いた画像は『牛飼いとアイコンの部屋』の画像を使わせて頂いています。

下記で実際に試す事が出来ます。

ImageTest4.html

( Written by Tatsuo Ikura )