私が持っているアプリケーションは非常に大きな画像(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 に画像をサブサンプリングさせることはできますか?