Java ImageIO で Flickr 並みのサムネイル画像をつくる

Java ImageIO で Flickr 並みのサムネイル画像をつくる

2007/02/11 8:38am

まあ、記事のタイトルがアレですけど…

Java の Image I/O で画像の縮小を行う方法として、AffineTransformOp を利用する方法がある。

final double scale = 0.5;
AffineTransformOp transformOp = new AffineTransformOp(AffineTransform.getScaleInstance(scale, scale), null);
BufferedImage dest1 = new BufferedImage(
    (int)(originalImage.getWidth() * scale),
    (int)(originalImage.getHeight() * scale),
    originalImage.getType());
transformOp.filter(originalImage, dest1);

しかし、この方法だとジャギーが目立ってしまい、Flickr ほどキレイなサムネイルにはならない。

たとえば、Flickr で見つけたこの写真。Flickr のサムネイルはこんな感じだが、

AffineTransformOp を用いた方法だと、こうなってしまう。

Java ImageIO AffineTransformOpで、どうするかというと、AWT の AreaAveragingScaleFilter を使うのがいいようだ。以下、API リファレンスより抜粋:

最近接点アルゴリズムよりもなめらかな結果が得られる、簡単な領域平均化アルゴリズムを使用してイメージをスケーリングする ImageFilter クラスです。

では、試してみる。

ImageFilter filter = new AreaAveragingScaleFilter(w, h);
ImageProducer im = new FilteredImageSource(image.getSource(), filter);
Image newImage = Toolkit.getDefaultToolkit().createImage(im);

フィルタした結果の java.awt.ImageBufferedImagebyte 配列に変換する方法は次回。

こんな感じになる。

Java ImageIO AreaAveragingScaleFilter格段にキレイだ。