Ich schreibe eine Anwendung, die Bilder als ImageIcons liest und anzeigt (in einem JLabel), die Anwendung muss JPEGs und Bitmaps unterstützen können.Java: Bilder lesen und als ImageIcon anzeigen
Für JPEGs finde ich, dass die Übergabe des Dateinamens direkt an den ImageIcon-Konstruktor funktioniert (auch für die Anzeige von zwei großen JPEGs), aber wenn ich ImageIO.read verwenden, um das Bild zu erhalten und das Bild an den ImageIcon-Konstruktor I übergeben Erhalte einen OutOfMemoryError (Java Heap Space), wenn das zweite Bild gelesen wird (unter Verwendung der gleichen Bilder wie zuvor). Wenn ich Bitmaps versuche, zu lesen, indem ich den Dateinamen an ImageIcon übergebe, wird nichts angezeigt, jedoch funktioniert das Lesen des Bildes mit ImageIO.read und anschließendes Verwenden dieses Bildes im ImageIcon-Konstruktor einwandfrei.
Ich verstehe aus dem Lesen anderer Forum Beiträge, dass der Grund, dass die beiden Methoden nicht die gleichen für die verschiedenen Formate arbeiten, ist Java Kompatibilitätsprobleme mit Bitmaps, aber es gibt einen Weg um mein Problem, so dass ich verwenden kann die gleiche Methode für Bitmaps und JPEGs ohne OutOfMemoryError?
(Ich mag die Heap-Größe, wenn möglich zu erhöhen, um zu vermeiden!)
Die OutOfMemoryError durch diese Linie ausgelöst werden:
img = getFileContentsAsImage(file);
und die Methodendefinition ist:
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;
}
Der Stack-Trace ist:
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)
Bitte geben Sie einen Beispielcode ein, der den OutOfMemoryError auslöst. – Thomas