Bonjour tout le monde,
Voila, j'ai deux problèmes avec l'utilisation de BufferedImage.
Premièrement, lorsque je veux charger une grosse image de 3500x2500 par exemple, j'ai un "OutOfMemory Exception" lors de l'initialisation du BufferedImage.
Sachant qu'avant l'ouverture du fichier, le programme lance juste une interface graphique assez simple, avec quelques miniatures.
Si la JVM a 64Mo par défaut, c'est amplement suffisant pour les 3500x2500x3 = 26Mo de l'image, non ?
Est-ce normal ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23 public BufferedImage createFullImage() { if(getFullImage() == null) { Toolkit tk = Toolkit.getDefaultToolkit(); // Création du BufferImage aux tailles de l'image Image TMPimg = tk.getImage(getFilename()); TMPimg = new ImageIcon(TMPimg).getImage(); setFullImage(new BufferedImage(TMPimg.getWidth(null), TMPimg.getHeight(null), BufferedImage.TYPE_INT_RGB)); // On dessine l'image dedans Graphics g = getFullImage().createGraphics(); g.drawImage(TMPimg,0,0,null); g.dispose(); TMPimg.flush(); TMPimg = null; } return getFullImage(); }
Je sais qu'on peut étendre la mémoire allouée par la VM. Si je l'étends à 512Mo , je n'ai plus le probleme de dépassement de mémoire.
Par contre, lorsque je veux afficher mon image dans un jPanel en redéfinissant la fonction PaintComponent, l'image est affichée 1/4 de seconde (premier passage dans Paint()), puis après n'est plus dessinée (on ne voit que le gris de fond).
La fonction passe pourtant toujours bien sur le DrawImage lors d'un repaint et il n'y a pas ce genre de problème pour les images de plus petite taille (celles qui passaient sans étendre la mémoire).
La seule "solution" que j'ai trouvé, c'est d'executer ceci :
lors de l'initialisation du panel. Cela a résolu mon problème mais ne me semble pas logique !
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 int[] mBi = new int[1]; image.getRGB(0,0,1,1,mBi,0,1);
Merci d'avance !
Partager