【发布时间】:2011-08-17 23:47:12
【问题描述】:
我试图让用户从他们的硬盘加载图像,并在 GUI 中以缩略图列表的形式直观地呈现这些图像(带有添加到 JList 的图标的 JPanel)。我目前正在使用 ImageIO.read() 来获取 BufferedImage 并为每个图像使用 getScaledInstance (听说你不应该使用它)。
它适用于小图像,但加载超过四张照片(5000x3000 或类似),我得到“java.lang.OutOfMemoryError: Java heap space”。没有保存对完整大小的 BufferedImage 的引用,所以我认为垃圾收集器会处理它并只保留缩放后的图像(这不应该占用太多内存),但它看起来不像。我也踩了 getRuntime().gc() 和 System.gc() ,但没有效果。
有什么好的方法可以从文件中加载缩放的图像,而不会遇到内存错误?显然,很多软件都可以做到这一点,但也许不是在 Java 中。外部库没问题。
当前代码:
BufferedImage unscaledImage = ImageIO.read(imageFile);
int unscaledHeight = unscaledImage.getHeight();
int unscaledWidth = unscaledImage.getWidth();
int imageRatio = unscaledHeight/unscaledWidth;
if (imageRatio >= 1) {
return new ImageIcon(unscaledImage.getScaledInstance(width,-1,Image.SCALE_FAST));
} else {
return new ImageIcon(unscaledImage.getScaledInstance(-1,height,Image.SCALE_FAST));
}
【问题讨论】:
标签: java memory-management image-processing thumbnails