月曜日, 14 2 月 2005
| JAIによる画像縮小 |
|
|
Javaを利用してサムネイルなどの画像縮小を行う際に一番メジャーなのはjava.awt.GraphicsのdrawImageメソッドではないだろうか。
確かにJ2SE標準のAPIなので手っ取り早いのだが、いかんせんニアレストによる補完が行われるため画質が粗くなってしまう。
こういう場合はJava Advanced Imaging (JAI)を利用すれば高画質で縮小させることができる。
javax.media.jai.Interpolationのスタティックフィールドに宣言されているINTERP_BICUBIC,INTERP_BICUBIC_2,INTERP_BILINEAR,INTERP_NEARESTがそれぞれバイキュービック、バイキュービック2、バイリニア、ニアレストによる補完方法になっていて、スケール変更の際のパラメータとして指定すればその方法で補完される。
以下はバイリニアにより元の画像の縦横1/2のサイズに縮小させる例。
元の画像

java.awt.GraphicsのdrawImageによる縮小

javax.media.jai.Interpolation.INTERP_BILINEARによる縮小

縮小された画像の画質にこだわる場合はJAIを使う方が賢明かと。
確かにJ2SE標準のAPIなので手っ取り早いのだが、いかんせんニアレストによる補完が行われるため画質が粗くなってしまう。
こういう場合はJava Advanced Imaging (JAI)を利用すれば高画質で縮小させることができる。
javax.media.jai.Interpolationのスタティックフィールドに宣言されているINTERP_BICUBIC,INTERP_BICUBIC_2,INTERP_BILINEAR,INTERP_NEARESTがそれぞれバイキュービック、バイキュービック2、バイリニア、ニアレストによる補完方法になっていて、スケール変更の際のパラメータとして指定すればその方法で補完される。
以下はバイリニアにより元の画像の縦横1/2のサイズに縮小させる例。
String readFileName = "sample.jpg";
String writeFileName = "sample2.jpg";
RenderedOp image = JAI.create("stream",new FileSeekableStream(new File(readFileName)));
Interpolation interp = Interpolation.getInstance(Interpolation.INTERP_BILINEAR);
ParameterBlock params = new ParameterBlock();
params.addSource(image);
params.add(0.5F);
params.add(0.5F);
params.add(0.0F);
params.add(0.0F);
params.add(interp);
RenderedOp image2 = JAI.create("scale", params);
JPEGEncodeParam encParam = new JPEGEncodeParam();
encParam.setQuality(0.95f);
JAI.create("filestore",writeFileName,"JPEG",encParam);元の画像

java.awt.GraphicsのdrawImageによる縮小

javax.media.jai.Interpolation.INTERP_BILINEARによる縮小

縮小された画像の画質にこだわる場合はJAIを使う方が賢明かと。
Posted by at 1:47 午前 in Java/






