Estoy escribiendo una aplicación que lee y muestra imágenes como ImageIcons (dentro de un JLabel), la aplicación necesita ser capaz de soportar jpegs y bitmaps.Java: Lectura de imágenes y visualización como ImageIcon
Para jpegs encuentro que pasar el nombre de archivo directamente al constructor ImageIcon funciona bien (incluso para mostrar dos jpegs grandes), sin embargo, si uso ImageIO.read para obtener la imagen y luego paso la imagen al constructor ImageIcon, obtener un OutOfMemoryError (Java Heap Space) cuando se lee la segunda imagen (usando las mismas imágenes que antes).
Para mapas de bits, si trato de leer pasando el nombre del archivo a ImageIcon, no se muestra nada, sin embargo leyendo la imagen con ImageIO.read y luego usando esta imagen en el constructor ImageIcon funciona bien.
Entiendo por leer en otros mensajes del foro que la razón de que los dos métodos no funcionen igual para los diferentes formatos es por problemas de compatibilidad de java con mapas de bits, pero hay una forma de solucionar mi problema para poder usar el mismo método para ambos mapas de bits y jpegs sin un OutOfMemoryError?
(me gustaría no tener que aumentar el tamaño de la pila si es posible!)
El OutOfMemoryError se desencadena por esta línea:
img = getFileContentsAsImage(file);
y la definición del método es:
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;
}
El seguimiento de la pila es:
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)
Por favor, publique código de muestra que active OutOfMemoryError. – Thomas