【发布时间】:2011-02-02 10:31:19
【问题描述】:
我正在编写一个应用程序,它将图像读取并显示为 ImageIcons(在 JLabel 中),该应用程序需要能够支持 jpegs 和位图。
对于 jpeg,我发现将文件名直接传递给 ImageIcon 构造函数可以正常工作(即使显示两个大 jpeg),但是如果我使用 ImageIO.read 获取图像然后将图像传递给 ImageIcon 构造函数,我会得到读取第二个图像时出现 OutOfMemoryError(Java Heap Space)(使用与之前相同的图像)。
对于位图,如果我尝试通过将文件名传递给 ImageIcon 进行读取,则不会显示任何内容,但是通过使用 ImageIO.read 读取图像然后在 ImageIcon 构造函数中使用该图像可以正常工作。
我从阅读其他论坛帖子中了解到,这两种方法对不同格式不起作用的原因是 java 与位图的兼容性问题,但是有没有办法解决我的问题,以便我可以使用没有 OutOfMemoryError 的位图和 jpeg 的方法相同?
(如果可能,我希望避免增加堆大小!)
OutOfMemoryError 由这一行触发:
img = getFileContentsAsImage(file);
方法定义为:
public static BufferedImage getFileContentsAsImage(File file) throws FileNotFoundException {
BufferedImage img = null;
try {
ImageIO.setUseCache(false);
img = ImageIO.read(file);
img.flush();
} catch (IOException ex) {
//log error
}
return img;
}
堆栈跟踪是:
Exception in thread "AWT-EventQueue-0" java.lang.OutOfMemoryError: Java heap space
at java.awt.image.DataBufferByte.<init>(DataBufferByte.java:58)
at java.awt.image.ComponentSampleModel.createDataBuffer(ComponentSampleModel.java:397)
at java.awt.image.Raster.createWritableRaster(Raster.java:938)
at javax.imageio.ImageTypeSpecifier.createBufferedImage(ImageTypeSpecifier.java:1056)
at javax.imageio.ImageReader.getDestination(ImageReader.java:2879)
at com.sun.imageio.plugins.jpeg.JPEGImageReader.readInternal(JPEGImageReader.java:925)
at com.sun.imageio.plugins.jpeg.JPEGImageReader.read(JPEGImageReader.java:897)
at javax.imageio.ImageIO.read(ImageIO.java:1422)
at javax.imageio.ImageIO.read(ImageIO.java:1282)
at framework.FileUtils.getFileContentsAsImage(FileUtils.java:33)
【问题讨论】:
-
请发布一些触发 OutOfMemoryError 的示例代码。
标签: java image memory bitmap jpeg