使用JAI读取时的子映像图像

时间:2009-11-01 18:54:10

标签: java jai

一个应用程序我读取了相当大的图像(jpegs),但只需要处理较小的图像,所以我用类似

的方式对它们进行子样本处理
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对图像进行二次采样吗?

2 个答案:

答案 0 :(得分: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();   

答案 1 :(得分:0)

我假设当您尝试转换为BufferedImage时会抛出内存不足异常?

如果是这种情况,那么可能考虑坚持使用JAI的create方法返回的RenderedOp,而是使用ParameterBlock和另一个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);

上面的代码完全没有经过测试,我很害怕,但是应该让你开始吧!

一旦你调整了RenderedOp的大小,你就应该能够安全地将它转换为BufferedImage。