java - 在 Java 中加载大图像作为缩略图而没有内存问题?

标签 java memory-management image-processing thumbnails

我试图让用户从他们的硬盘驱动器加载图像,并在 GUI 中以缩略图列表的形式直观地呈现这些图像(JPanels 将图标添加到 JList)。我目前正在使用 ImageIO.read() 来获取 BufferedImage 并对每个图像使用 getScaledInstance (听说你不应该使用它)。

它在处理小图片时效果相当好,但加载超过四张照片(5000x3000 或类似图片)时,我得到“java.lang.OutOfMemoryError:Java 堆空间”。未保存对完整大小 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));
}

最佳答案

问题出在 BufferedImage 本身的使用上。当文件被读入内存时,您将用完堆空间。根据它的用途,您可以使用图像阅读器或增加堆的大小。

我建议您使用图像阅读器。例如,要获得图像阅读器,您的代码应该是这样的:

  // Create an image input stream on the image
    ImageInputStream iis = ImageIO.createImageInputStream(o);

    // Find all image readers that recognize the image format
    Iterator iter = ImageIO.getImageReaders(iis);
    if (!iter.hasNext()) {
        // No readers found
        return null;
    }

    // Use the first reader
    ImageReader reader = (ImageReader)iter.next();

发件人:http://www.exampledepot.com/egs/javax.imageio/DiscType.html

如果您拥有 ImageReader,您可以通过调用 reader.getAspectRatio()

获取纵横比

不过,我不确定您如何从 ImageReader 转到缩略图。

关于java - 在 Java 中加载大图像作为缩略图而没有内存问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5874593/

相关文章:

java - 变量变为字段、栈变为堆的过程是怎样的?

java - Spring ClientHttpRequestInterceptor请求/响应为空

java - 存储一个数组以填充它并在单行中打印它

.net - string.Empty 在 CLR 中占用多少空间

c++ - opencv sgbm 在对象边缘产生异常值

c - opencv 函数 cvCreateMatHeader 中的非正宽度或高度

java - Android游戏分数int通过servlet添加到access数据库中

memory-management - 为什么我们不应该在嵌入式系统中动态分配不同大小的内存

c++ - 我的文本编辑器应用程序是否存在内存泄漏?为什么它消耗的内存比记事本多 3 倍

matlab - 图像处理中的数字识别算法/准则