イメージ全体のサブセットを、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() メソッドが、非同期スレッドで raw イメージを再読み込みすることにより、画面イメージの表現をまったく新しく作成する一方、新しいメソッドは拡大縮小されていないイメージバージョンからのピクセルを常に使用し、画面に描画することです。結果として、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); } }