2004/12/23

今日の Java

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

画像の拡大、縮小 2

今日は Graphics#drawImage メソッドです。多分、一番よく知られたものではないでしょうか。Java2D を知らなくてもいいので、多分一番知られていて、かつ、一番単純な方法だとおもいます。

サンプルを下に示しておきます。長くなるので import は省略してあります。 ダウンロードはこちらから。

拡大、縮小をおこなっているのが rescale メソッドです。

public class RescalerByDrawImage {
    public RescalerByDrawImage(String file, int width, int height) {
        try {
            BufferedImage org = ImageIO.read(new File(file));
 
            long start = System.nanoTime();
            BufferedImage dst = rescale(org, width, height);
            long end = System.nanoTime();
 
            System.out.printf("Time: %d ns%n", (end - start));
 
            ImageIO.write(dst, "png", new File("result.png"));
        } catch (IOException ex) {
            ex.printStackTrace();
        }
    }
 
    public BufferedImage rescale(BufferedImage org, int width, int height) {
        BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);
        Graphics2D g = (Graphics2D)image.getGraphics();
 
        g.drawImage(org, 0, 0, width, height, null);
        g.dispose();
         
        return image;
    }
 
    public static void main(String[] args) {
        String file = args[0];
        int width = Integer.parseInt(args[1]);
        int height = Integer.parseInt(args[2]);
 
        new RescalerByDrawImage(file, width, height);
    }
}

Graphics#drawImage メソッドは引数によって 6 種類あります。イメージの拡大、縮小を行うのは width, height を引数にするもの、dx1, dy1, dx2, dy2, sx1, sy1, sx2, sy2 を引数にするものの 4 種類です。width, height を引数にするものの方が単純なので、今回はそちらを使いました。

まずやらなくてはいけないのが、最終的な大きさのイメージを作ることです。Component#createImage メソッドを使ってイメージを生成するより、BufferedImage クラスを使うほうがいいと思います。

イメージが作れたら、Image#getGraphics メソッドを使って Graphics オブジェクトを取りだします。

そして、Graphics#drawImage メソッドを使って、オリジナルのイメージをそこに書きこむわけです。最後の引数は ImageObserver オブジェクトですが、なければ null でかまいません。

Graphics オブジェクトは使い終わったら dispose メソッドを使って、破棄しておきます。

さて、これを実行してみましょう。実行には jdk5.0 update 1 を使用し、OS は Windows XP、CPU が P4 560、メモリ 1GB で行いました。

使用した画像は 600 万画素のデジカメ画像で大きさは 3008x2000 です。それを 150x100 に縮小してみました。

C:\temp>java RescalerWDrawImage original.jpg 150 100
Time: 41815251 ns

だいたい、30 ms から 40 ms ぐらいのようです。

0 件のコメント: