特に、イメージが画面に表示されるとき、Image データは画面の配色機能に合う形式に変換されます。元のイメージデータは持続的に格納されず、変換された画面データだけが画面表示によって格納されます。イメージのデータが他の目的 (新しいイメージのためのデータのフィルタリングなど) で必要な場合、raw データを元のソースから再ロードする必要があります。
描画された各サイズに対して別個のイメージ表示を格納することのもう 1 つの欠点は、消費するメモリの量です。描画された各サイズに対して別個の表示を格納する方法は、すべてのデータが画面にバイト単位でコピーされるため、レンダリング速度を最小にします。しかし、この方法は結果的に逆効果になります。拡大縮小されたサイズを事前に計算することによって速度を短縮しても、拡大縮小された変異形がロードされ変換される間の待ち時間があるために短縮した意味がなくなります。イメージデータを遅いネットワーク上で再ロードする必要がある場合は特にそうです。また、イメージが繰り返されず多数の異なるサイズで描画されている場合、拡大縮小された表示をキャッシュするために使用するメモリが浪費されます。
つまり、イメージの拡大縮小されたバージョンが後続のレンダリングにキャッシュされるかどうか、イメージスケーリングがただちに行われるかまたはバックグラウンドで行われるかを、プログラマは制御することができません。
これ以外に開発者にとって問題となるのは、既存のイメージの拡大縮小されたビューを表わす新しいオブジェクトを作成する方法がないことです。Image オブジェクトは、新しい幅と高さのパラメータを drawImage の呼び出しに与えることで拡大縮小できますが、その情報を Image オブジェクトにカプセル化し、その Image オブジェクトを渡すことによって希望するサイズのイメージを描画する方法はありません。
この変更には 2 つの主な欠点があります。
あとに明らかになったことですが、1 つ目の問題は当初予想していたほどは大きなものではありません。過去 2、3 年で、プロセッサは、特にメモリシステムと比較して非常に速くなっています。結果として、イメージスケーリングのパフォーマンスは、ほとんどがメモリアクセス速度によって制限され、希望する特定のスケーリングのために、画面にコピーする次のピクセルがどれかを決定するために必要な計算は、データを画面に移動する作業に比べてさほど問題にはなりません。
品質については大きな問題になる可能性がありました。1.1 より前の JDK 実装に使用された 8 ビット色変換コードでは、ディザリングのあとに拡大縮小された場合、イメージが大幅に劣化しました。新しい色変換アルゴリズムが 1.1 用に開発され、結果のディザイメージの品質が向上しました。ディザ表示のスケーリングの結果は、スケーリングのあとにディザリングされる 1.0.2 イメージの結果よりよくないとしても、通常同じくらいになりました。
イメージスケーリングの実装は 1.1 で強化され、レンダリング時に瞬時にスケーリングすることが可能になりました。しかし、拡大縮小されたイメージの品質を向上させるために、可能なあらゆる手段をとることを希望する場合もあります。レンダリング時にではなく、プログラマが明示的なスケーリングをいつ実行するかを選択できるように、2 つの新しいフィルタクラスが使用可能になり、新しい便利なメソッドが 1.1 の AWT Image クラスに追加されます。この同じ API をプログラマが使用して、自分自身の Image オブジェクトにカプセル化されるイメージの拡大縮小されたバージョンを表す新しい Image オブジェクトを作成することできます。新しいイメージスケーリングクラスには、次のものがあります。
java.awt.image.ReplicateScaleFilter java.awt.image.AreaAveragingScaleFilterImage クラスの新しいメソッドは次のとおりです。
getScaledInstance(int width, int height, int hints)hints パラメータは、イメージを拡大縮小するためにどの種類のアルゴリズムを使用するかを制御します。hints には、使用する特定のアルゴリズムを参照する指定や、速度や品質のためにオペレーションを最適化するかどうかを指示するさらに抽象的な指定があります。現在 hints パラメータに設定できる適正な値は、次のとおりです。
Image.SCALE_DEFAULT
Image.SCALE_FAST
Image.SCALE_SMOOTH
Image.SCALE_REPLICATE
Image.SCALE_AREA_AVERAGING
import java.awt.*; import java.applet.*; public class ImgScaleExample extends Applet { Image img, img2; public void init() { img = getImage(getDocumentBase(), "foo.gif"); img2 = img.getScaledInstance(100, 100, Image.SCALE_DEFAULT); } public void paint(Graphics g) { // Draw the full size image g.drawImage(img, 0, 0, this); // Draw the scaled version of the image g.drawImage(img2, 10, 10, this); // Now draw a scaled version of the scaled image g.drawImage(img2, 110, 10, 50, 50, this); } }