イメージ全体のサブセットを、Graphics オブジェクトのクロッピングフィルタまたはクリッピング機構を使用せずにレンダする方法はありません。この状況は、Graphics オブジェクトのクリップ属性がもっと制限された値にしかセットできないという事実のために、複雑になります。これは決して拡張したり、以前のクリップ領域に復元したりできません。
イメージをスケールする既存のメソッドもまた、プログラマがイメージを負のサイズにスケールしたり他の方法によって、水平または垂直にフリップすることを許しません。他の任意のイメージ操作はサポートされていないとしても、フリッピングの欠如は顕著です。その理由は、既にサポートされているスケールアルゴリズムに対する小さな算術的修正で、これを簡単に管理できるからです。
drawImage(Image img, int dx1, int dy1, int dx2, int dy2, int sx1, int sy1, int sx2, int sy2, ImageObserver observer) drawImage(Image img, int dx1, int dy1, int dx2, int dy2, int sx1, int sy1, int sx2, int sy2, Color bgcolor, ImageObserver observer)
これら新しいメソッドの面白い点は、以前の drawImage() メソッドが、非同期スレッドの生のイメージを再読み込みして画面イメージの全く新しい表現を作成する一方、新しいメソッドは常にスケールされていないイメージバージョンからのピクセルを使用し、画面に描画することです。結果として、2 つの新しいメソッドは、イメージの全サイズバージョンが、 MediaTracker または他のイメージステータス API が示すようにロードされ変換される限り、同期的に完了します。
新しいメソッドの座標仕様におけるもう 1 つの面白い変更点は、ソースと転送先矩形を定義するための 2 つの座標の使用です。負の幅と高さは残りの Java API で既存の意味を持ち続けるため、新しいメソッドは新しい座標対仕様を使用し、どの次元がフリップされるかを明示的に制御できるようにします。この新しいシステムはまた、ユーザのマウスのドラッグに従ってイメージのすみを追跡するいくつかのアプリケーションにとって便利なものです。ドラッグの開始と終了座標をx、y、w、hフォーマットに分解する必要はありません。
イメージクロッピングを実行するための古い API の使用方法を示すサンプルコードを、次に示します:
import java.awt.*;
import java.applet.*;
public class ImgCropExample extends Applet {
Image bgimg, img2;
public void paint(Graphics g) {
// Draw a background image
g.drawImage(bgimg, 0, 0, this);
// Draw the upper left 100x100 portion of another image at 10,10
Graphics g2 = g.create();
g2.clipRect(10, 10, 100, 100);
g2.drawImage(img2, 10, 10, this);
g2.dispose(); // reclaims resources more quickly
// Now continue drawing with original clip area
g.fillRect(0, 0, 10, 10);
}
}
イメージクロッピングを実行するための新しい API の使用方法を示すサンプルコードを、次に示します:
import java.awt.*;
import java.applet.*;
public class ImgCropExample extends Applet {
Image bgimg, img2;
public void paint(Graphics g) {
// Draw a background image
g.drawImage(bgimg, 0, 0, this);
// Draw the upper left 100x100 portion of another image at 10,10
g.drawImage(img2,
10, 10, 110, 110,
0, 0, 100, 100, this);
// Now continue drawing with original clip area
g.fillRect(0, 0, 10, 10);
}
}
イメージフリッピングを実行するための新しい API の使用方法を示すサンプルコードを、次に示します:
import java.awt.*;
import java.applet.*;
public class ImgCropExample extends Applet {
Image img2;
public void paint(Graphics g) {
// Draw the center 100x100 portion of a 200x200 image
// at location 10, 10, flipped horizontally.
g.drawImage(img2,
10, 10, 110, 110,
150, 50, 50, 150, this);
}
}