2005/01/01

今日の Java

このエントリーをはてなブックマークに追加

画像の拡大、縮小 4

今回は AffineTransformOp クラスを使用した拡大/縮小です。

Java2D では画像を扱うためのいろいろな画像処理用のクラスがあります。BufferedImage クラスに対する処理用クラスが BufferedImageOp インタフェースで、Raster クラスに対応するのが RasterOp インタフェースです。Op というのは Operation のことですね。

これらのインタフェースをインプリメントしたクラスの中で画像のアフィン変換を行うのが AffineTransoformOp クラスです。

今までの方法とちょっと違うのは拡大/縮小を行うときにアルゴリズムを選択できることです。選択できるのはバイキュービック、バイリニア、最近傍の 3 種類です。(実をいうと Graphics#drawImage メソッドでもこれらのアルゴリズムを選択できます)

さて、サンプルですが、前回と同じように拡大/縮小の部分だけ。ダウンロードはこちらから。

    public BufferedImage rescale(BufferedImage org, int width, int height) {
        BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);
        
        double sx = (double)width / (double)org.getWidth();
        double sy = (double)height / (double)org.getHeight();
        AffineTransform trans = AffineTransform.getScaleInstance(sx, sy);
        AffineTransformOp operation = new AffineTransformOp(trans, 
           AffineTransformOp.TYPE_BILINEAR);
  
        operation.filter(org, image);
  
        return image;
    }

AffineTransformOp クラスは使用する AffineTransform オブジェクトをコンストラクタの引数にします。第 2 引数がアルゴリズムになります。

変換を行うのが filter メソッドで、第 1 引数のイメージを変換したものが第 2 引数のイメージになります。

これを実行すると遅いです ^^;; 3 種類のアルゴリズムをすべて試しましたが、Graphcis#drawImage メソッドを使うよりも格段に遅いです。そこら辺の評価はまた後ほどやりましょう。

0 件のコメント: