J'écris une application qui lit et affiche des images comme ImageIcons (dans un JLabel), l'application doit être capable de supporter les jpegs et les bitmaps. Pour les jpeg, je trouve que passer le nom de fichier directement au constructeur ImageIcon fonctionne bien (même pour afficher deux grands jpeg), mais si j'utilise ImageIO.read pour obtenir l'image, puis passer l'image au constructeur ImageIcon, je obtenez une OutOfMemoryError (Java Heap Space) lorsque la seconde image est lue (en utilisant les mêmes images que précédemment). Pour les bitmaps, si j'essaie de lire en passant le nom de fichier à ImageIcon, rien n'est affiché, cependant en lisant l'image avec ImageIO.read et en utilisant cette image dans le constructeur ImageIcon fonctionne très bien. En lisant les autres messages du forum, je comprends que la raison pour laquelle les deux méthodes ne fonctionnent pas de la même manière pour les différents formats est liée aux problèmes de compatibilité de java avec les bitmaps, mais il existe un moyen de contourner la même méthode pour les bitmaps et jpegs sans OutOfMemoryError?Java: Lire des images et afficher comme un ImageIcon
(je voudrais éviter d'avoir à augmenter la taille du tas si possible!)
Le OutOfMemoryError est déclenché par cette ligne:
img = getFileContentsAsImage(file);
et la définition de la méthode est:
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;
}
La trace de pile est:
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)
Veuillez publier un exemple de code qui déclenche OutOfMemoryError. – Thomas