- PR -

画像の縮小について

投稿者投稿内容
おちゃ
常連さん
会議室デビュー日: 2005/01/07
投稿数: 25
投稿日時: 2005-03-30 19:45
現在、画像(JPEG)を縮小するプログラムを作っています。

private BufferedImage readShrinkImage(ImageReader reader, double power) {
BufferedImage shrinkImage = null;

try {
BufferedImage image = reader.read(0);

shrinkImage = new BufferedImage((int)(image.getWidth()*power), (int)(image.getHeight()*power),
image.getType());
AffineTransformOp atOp = new AffineTransformOp(
AffineTransform.getScaleInstance(power, power), AffineTransformOp.TYPE_BILINEAR);
atOp.filter(image, shrinkImage);

} catch (IOException ex) {
ex.printStackTrace();
}

return shrinkImage;
}

上記のようなメソッドを作って、画像(800x600)を縮小したところ、大きさが元画像の40%以上縮小すると、ジャギが非常に目立ってしまい満足する結果が得られませんでした。

そこで、画像のスケーリング性能の高いライブラリ、または手法を探していますが、よいものをご存知ではないでしょうか。
この後、JAI を試してみようと思いますが、すでにご使用になられた方の意見を聞いてみたいです。

よろしくご教示お願いいたします。

[ メッセージ編集済み 編集者: おちゃ 編集日時 2005-03-30 19:47 ]
a-san
ベテラン
会議室デビュー日: 2004/06/01
投稿数: 53
投稿日時: 2005-03-31 00:32
Java2Dに描画の品質を変えれる機能があります。
Graphics2D.addRenderingHints(Map hints)
RenderingHints.KEY_RENDERING
RenderingHints.VALUE_RENDER_QUALITY
ひょっとしたら、プラットフォームやバージョンで違うかもしれませんが、
Windows,Java1.4ではいけてます。
おちゃ
常連さん
会議室デビュー日: 2005/01/07
投稿数: 25
投稿日時: 2005-03-31 22:59
a-sanさんありがとうございます。



private BufferedImage readShrinkImage(ImageReader reader, double power) {
BufferedImage shrinkImage = null;

try {
BufferedImage image = reader.read(0);

shrinkImage = new BufferedImage((int)(image.getWidth()*power), (int)(image.getHeight()*power),
image.getType());

HashMap hints = new HashMap();
hints.clear();
hints.put(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR);
hints.put(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY);
hints.put(RenderingHints.KEY_ALPHA_INTERPOLATION, RenderingHints.VALUE_ALPHA_INTERPOLATION_QUALITY);
hints.put(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ALPHA_INTERPOLATION_QUALITY);
hints.put(RenderingHints.KEY_COLOR_RENDERING, RenderingHints.VALUE_COLOR_RENDER_QUALITY);
hints.put(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
hints.put(RenderingHints.KEY_DITHERING, RenderingHints.VALUE_DITHER_DISABLE);

AffineTransformOp atOp = new AffineTransformOp(
AffineTransform.getScaleInstance(power, power), new RenderingHints(hints) );
atOp.filter(image, shrinkImage);

} catch (IOException ex) {
ex.printStackTrace();
}

return shrinkImage;
}


こんな感じに変更してみましたが、画質が上がっている様子が見られませんでした。
どこか間違ってしまったのでしょうか…。

引き続き皆様のご教示、お願い申し上げます。
holic
ベテラン
会議室デビュー日: 2004/08/24
投稿数: 74
投稿日時: 2005-03-31 23:24
引用:

hints.put(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR);



ジャギが問題なら、BILINEAR を BICUBIC にするだけで改善しませんか?
おちゃ
常連さん
会議室デビュー日: 2005/01/07
投稿数: 25
投稿日時: 2005-04-01 13:26
holicさん、ありがとうございます。

BICUBICも試してみましたが、まったく変化がありません。
その他のパラメータも、変更してみたのですが、まったく画質が変わりません。

なにか、根本的に間違っているのでしょうか??
a-san
常連さん
会議室デビュー日: 2004/03/15
投稿数: 30
投稿日時: 2005-04-01 16:27
以下で試してみてください。
コード:
import java.io.*;

import java.awt.*;
import java.awt.geom.*;
import java.awt.image.*;
import java.util.*;
import javax.swing.*;
import javax.imageio.*;

class TestRenderingHints extends JComponent {
Image image;
TestRenderingHints(Image image) {
this.image = image;
}
public void paintComponent(Graphics g) {
Graphics2D g2 = (Graphics2D)g;

// レンダリング時の参考値を設定する。
HashMap hints = new HashMap();
hints.clear();
hints.put(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR);
hints.put(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY);
hints.put(RenderingHints.KEY_ALPHA_INTERPOLATION, RenderingHints.VALUE_ALPHA_INTERPOLATION_QUALITY);
hints.put(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ALPHA_INTERPOLATION_QUALITY);
hints.put(RenderingHints.KEY_COLOR_RENDERING, RenderingHints.VALUE_COLOR_RENDER_QUALITY);
hints.put(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
hints.put(RenderingHints.KEY_DITHERING, RenderingHints.VALUE_DITHER_DISABLE);
g2.setRenderingHints(hints);

double scale = 0.1;
AffineTransform tx = AffineTransform.getScaleInstance(scale, scale);
g2.drawImage(image, tx, null);
}
// 引数に画像のファイル名を指定
public static void main(String[] args) throws Exception {
BufferedImage image = ImageIO.read(new File(args[0]));
TestRenderingHints comp = new TestRenderingHints(image);
JFrame frame = new JFrame();
frame.getContentPane().add(comp);
frame.setSize(640, 480);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
}




[ メッセージ編集済み 編集者: a-san 編集日時 2005-04-01 16:30 ]
おちゃ
常連さん
会議室デビュー日: 2005/01/07
投稿数: 25
投稿日時: 2005-04-02 19:34
a-sanさん、サンプルコードありがとうございます。
ご提供いただいたサンプルコードをそのままコンパイルし、実行してみたのですが
望んでいたクオリティの縮小画像を得ることができませんでした。(私の作ったプログラムと同程度)

Windows の GDI+ 程度のクオリティを求めているのですが、標準のAPIのみでは難しいのでしょうか・・・
おちゃ
常連さん
会議室デビュー日: 2005/01/07
投稿数: 25
投稿日時: 2005-04-02 19:54
ちなみに実行環境は

Windows XP SP2
J2SDK 1.4.2_6

です。

スキルアップ/キャリアアップ(JOB@IT)