画像の拡大、縮小 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 ぐらいのようです。
2004/12/23
今日の Java
登録:
コメントの投稿 (Atom)
0 件のコメント:
コメントを投稿