質問

私が持っているアプリケーションは非常に大きく、画像(JPEGファイル)を読み込みだけ、私は

のようなものでそれらをサブサンプリングして小さい画像で作業する必要があります
ImageReadParam param = reader.getDefaultReadParam();
param.setSourceSubsampling(4, 4, 0, 0);
img = reader.read(0);

しかし、一つは、私が使用する必要があり、コードは以下である(画像を読み取り、次いで、サイズを変更するJAIをしない使用している、私は戻って他の方法に落ちたいくつかのメタデータを扱わないJPEGリーダーのバグ)いくつかのデプロイメント環境は、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を得ることができますとにかくありますか?

役に立ちましたか?

解決

私はあなたのBufferedImageへの変換を行うためにしようとすると、メモリ不足の例外のうちがスローされたと仮定している?

その場合は、

おそらくRenderedOpに付着考慮メソッドを作成し、代わりにスケーリングされた画像を生成するために作成するのParameterBlockさらにJAIを使用JAI者によって返されたということ?

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);

上記のコードは、私は怖いが、あなたが始める必要があり、標準として完全にテストされていない来て!

あなたはあなたがしなければならない場合、安全のBufferedImageに変換することができるはずRenderedOpをリサイズしているんだいったんます。

他のヒント

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();   
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top