画像(Image)の拡大縮小

JavaAPIは基本ライブラリでもそれなりの画像加工が可能な為、Appletなどで実行させるときには便利です。
というわけで、拡大縮小ですが、幾つかの方法があるのでメモしておきます。

Graphics#drawImage の引数で指定する

画像のレンダリングだけ拡大縮小したい場合、一番簡単な方法はdrawImageの引数でサイズを指定することです。
この方法はpaintComponentなどで描画する時で崩れても良いからメモリも節約して素早く表示したいときに有効です。

@Override
public void paintComponents(Graphics g) {
  g.drawImage(img, x, y, width, height, this);
}

Image#getScaledInstance でImageを作成

拡大縮小したImageのインスタンスを生成するにはgetScaledInstance を使うのが簡単です。
ただし、サイズの異なるインスタンスを大量に作り保持しているとメモリを圧迫するので注意しなくてはなりません。

Image scaledImg = img.getScaledInstance(width, height, Image.SCALE_DEFAULT);

引数には縮小後の幅と高さに加え、どんな方法で拡大縮小をかけるかのヒントを与えます。速度重視から画質重視まで選べます。

Graphics2D#setTransformで変換

画像処理といえば行列式による変換ですが、AffineTransform で変換行列を定義する事もできます。
拡大縮小の他に平行移動や回転なども行いたい場合は便利です。

@Override
public void paintComponents(Graphics g) {
  Graphics2D g2 = (Graphics2D) g;
  g2.setTransform(AffineTransform.getScaleInstance(0.5, 0.5));
  g2.drawImage(img, x, y, this);
}