我已经读取了相当大的图像(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) {
// ...
}
然而,有些图像真的很大,有时我会出现内存不足的异常,无论如何我可以让 JAI 在以我使用 ImageReader 读取图像的方式读取图像时对图像进行二次采样?