Java ImageIO で Flickr 並みのサムネイル画像をつくる
まあ、記事のタイトルがアレですけど…
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
を用いた方法だと、こうなってしまう。
で、どうするかというと、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.Image
を BufferedImage や byte
配列に変換する方法は次回。
こんな感じになる。