这是应用程序,我有相当大的图像(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) {
// ...
}

然而一些图片是真的大了,现在我再次走出内存异常,反正是有,我可以得到JAI子采样图像,当它在我读使用一个ImageReader影像的方式读?

有帮助吗?

解决方案

我假设的内存溢出异常被抛出当您尝试进行转换,以一个BufferedImage?

如果这是那么也许考虑粘附至由JAI的返回创建方法,而是使用一的ParameterBlock和另一JAI创建,以产生所述经缩放图像的RenderedOp的情况?

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,如果你不得不这样做。

其他提示

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