当前位置: 首页 > 面试题库 >

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

琴光亮
2023-03-14
问题内容

我试图让用户从其硬盘驱动器中加载图像,并在GUI中以缩略图列表的形式直观显示这些图像(JPanel的图标添加到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转换为缩略图。



 类似资料:
  • 问题内容: 我有一个5000 x 4000像素的图像,想要绘制到画布上。 首先,我尝试从资源中加载它。我把它放进去了。 我使用以下方法: 它像魅力一样运作。 在这种情况下,是。 所以现在我想从sdcard加载它。 这是我尝试做的事情: 在这种情况下,是,创建时得到了。 所以我想知道: 有没有一种方法可以加载图像而不会出现该错误?还是有办法将a转换为? 注意: 我不想调整图像的大小,因为我正在实现缩

  • JDK:1.8U112 oracle JRE:10.0.2 JVM最大堆大小:~2GB。 一个简单的GUI,可以打开图像文件(JPG/PNG)并通过用户输入放大它。 DESC 类扩展了JFrame。框架的contentPane有一个JButton、一个JLabel和一个JScrollPane。单击该按钮将显示一个JFileChooser。标签位于滚动窗格内。选择一个文件将在标签中打开它(仅为本问题

  • 我想在我的Android应用程序中增加位图的大小。 基本上,我想创建一个新的位图,其宽度与原始位图相同,但高度更大。(新)额外像素的背景可以是黑色、白色或透明。 我该怎么做?

  • 据我所知,您可以通过以下方式使用PIL获取图像大小 但是,我希望获得图像的宽度和高度,而不必将图像加载到内存中。可能吗?我只做图像大小的统计,不关心图像内容。我只是想让我的处理速度更快。

  • 我正在尝试为一个大图像(8200x11800像素)创建一个缩略图,所以GD不是一个选项。我被告知Imagick将通过使用磁盘空间而不是ram内存来克服内存限制,因此我安装了它,并按照如下方式重写了mi脚本: 但我仍然得到没有消息,就像以前发生在GD内存不够时一样,任何想法?谢啦 BTW设置为512 MB,在这里您可以获取原始图像文件。

  • 我有一个jfilechooser,它帮助搜索和选择图像上传到项目数据库。还有一个缩略图类可以将上传的图像压缩成所需的大小。运行文件选择器的按钮action_performed的代码如下: