Piszę aplikację, która odczytuje i wyświetla obrazy jako ImageIcons (w ramach JLabel), aplikacja musi obsługiwać jpeg i bitmapy.Java: Odczytywanie obrazów i wyświetlanie jako ImageIcon
Dla jpegs stwierdzam, że podanie nazwy pliku bezpośrednio do konstruktora ImageIcon działa poprawnie (nawet w przypadku wyświetlania dwóch dużych jpegów), jednak jeśli użyję ImageIO.read, aby uzyskać obraz, a następnie przekazać obraz do konstruktora ImageIcon, uzyskać OutOfMemoryError (Java Heap Space) po odczytaniu drugiego obrazu (przy użyciu tych samych obrazów, co wcześniej).
Dla bitmap, jeśli próbuję odczytać, przekazując nazwę pliku do ImageIcon, nic nie jest wyświetlane, jednak czytając obraz z ImageIO.read, a następnie używając tego obrazu w konstruktorze ImageIcon działa dobrze.
Rozumiem, czytając inne posty na forum, że powodem, dla którego obie metody nie działają tak samo dla różnych formatów, są problemy z kompatybilnością java z bitmapami, jednak istnieje sposób obejścia mojego problemu, aby można było używać ta sama metoda dla bitmap i jpegów bez OutOfMemoryError?
(chciałbym uniknąć konieczności zwiększyć rozmiar sterty, jeśli to możliwe!)
OutOfMemoryError jest wyzwalane przez tę linię:
img = getFileContentsAsImage(file);
i definicji metody jest:
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;
}
Śledzenie stosu:
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)
Proszę napisać przykładowy kod, który wyzwala OutOfMemoryError. – Thomas