0

私が持っているアプリケーションは非常に大きな画像(jpeg)を読み取りますが、小さな画像でのみ動作する必要があるため、次のようなものでサブサンプリングします

ImageReadParam param = reader.getDefaultReadParam();
param.setSourceSubsampling(4, 4, 0, 0);
img = reader.read(0);

ただし、他の方法にフォールバックした一部のメタデータを処理しない jpeg リーダーのバグにより、JAI を使用して画像を読み取り、サイズを変更しています (コードは以下にあり、一部としてリフレクションを使用する必要はありません)。デプロイメント環境では JAI を使用できません。これをうまく設計できることはわかっていますが、実際にはそうなっています)。

try {
Class<?> c = ImageUtil.class.getClassLoader().loadClass("javax.media.jai.JAI");

if (c != null) { 
    URL url = new URL("file://" + file.getAbsolutePath());
    Method m = c.getMethod("create", String.class, Object.class);
    Object pi = m.invoke(null, "url", url);
    img = (BufferedImage) pi.getClass().getMethod("getAsBufferedImage").invoke(pi);
}
} catch (Throwable tt) {
// ...
}

ただし、一部の画像は非常に大きく、メモリ不足の例外が発生することがありますが、ImageReader を使用して画像を読み取る方法で読み取ったときに、JAI に画像をサブサンプリングさせることはできますか?

4

2 に答える 2

2
RenderedOp rop = JAI.create("fileload", file.getAbsolutePath());

ParameterBlock pb = new ParameterBlock();
pb.addSource(rop);
pb.add(0.5f);
pb.add(0.5f);
rop = JAI.create("scale", pb);

// For better looking results, but slower:
// rop = JAI.create("SubsampleAverage", pb);

BufferedImage bufImg = rop.getAsBufferedImage();   
于 2012-11-21T15:11:15.873 に答える
0

BufferedImage に変換しようとすると、メモリ不足の例外がスローされると思いますか?

その場合は、JAI の create メソッドによって返される RenderedOp に固執し、代わりに ParameterBlock とさらに JAI create を使用してスケーリングされた画像を生成することを検討してください。

ParameterBlock paramBlock = new ParameterBlock();
paramBlock.addSource(((RenderedOp) pi).createInstance()); // Updated this
paramBlock.add(0.5f); // x Scale (Change these two Scale values!)
paramBlock.add(0.5f); // y Scale
paramBlock.add(0.0f); // x Translate
paramBlock.add(0.0f); // y Translate
paramBlock.add(new InterpolationBilinear()); // I think this Interpolation should work...)
RenderedOp resized = JAI.create("scale", paramBlock, null);

上記のコードは、標準としては完全にテストされていませんが、開始する必要があります。

サイズ変更された RenderedOp を取得したら、必要に応じて安全に BufferedImage に変換できるはずです。

于 2009-11-01T19:34:49.327 に答える