我正在编写一个应用程序,它将图像作为ImageIcons(在JLabel中)读取和显示,该应用程序需要能够支持jpeg和位图。
对于jpeg格式的图片,我发现直接将文件名传递给ImageIcon构造函数可以正常工作(即使显示两个大型jpeg),但是如果我使用ImageIO.read获取图像,然后将图像传递给ImageIcon构造函数,则在读取第二个图像时会出现OutOfMemoryError(Java Heap Space)(使用与之前相同的图像)。
对于位图,如果我尝试通过将文件名传递给ImageIcon来读取,那么什么也不会显示,但是通过使用ImageIO.read读取图像,然后在ImageIcon构造函数中使用此图像可以正常工作。
从阅读其他论坛帖子中了解到,两种方法在不同格式上不起作用的原因是由于Java与位图的兼容性问题,但是是否有一种方法可以解决我的问题,以便我可以在不出现OutOfMemoryError的情况下同时使用两种方法处理位图和jpeg?
(如果可能的话,我想避免增加堆大小!)
OutOfMemoryError由以下行触发:
堆栈跟踪如下:
对于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)