Bonjour,

Je suis assez embêté par un petit problème.
J'essaye de coder un programme qui va rechercher des images (format jpeg, png, ...) sur le disque et qui crée des icones miniatures pour les afficher.

Ma démarche est la suivante: j'ouvre l'image dans un "BufferedImage", je calcule la futur taille de la miniature puis je met cette miniature dans un ImageIcon.

Voici la fonction qui effectue cette tâche.

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
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
 
public ImageIcon getTiny(int maxWidth, int maxHeight) throws IOException
{
	BufferedImage img = null;
	File fi = new File(_path);
	if (fi.exists() && fi.isFile() && fi.canRead())
	{
		img = ImageIO.read(fi);
		if (img == null)
		{
			throw new IOException("Le fichier \"" + fi.getName() + "\" est illisible");
		}
	}
	else
	{
		throw new IOException("Impossible d'ouvrir le fichier \"" + _path +"\"");
	}
 
	int wid = img.getWidth();
	int hei = img.getHeight();
	float ratio = (float) wid / hei;
	if (wid >= hei)
	{
		wid = maxWidth;
		hei = (int) (maxWidth / ratio);
	}
	else
	{
		hei = maxHeight;
		wid = (int) (maxHeight * ratio);
	}
	ImageIcon imIcon = new ImageIcon(img.getScaledInstance(wid, hei,java.awt.Image.SCALE_SMOOTH));
 
	img = null;
	System.gc(); // J'essaye de forcer le Garbage collector à nettoyer (mais ça ne marche pas)
 
	return imIcon;
}
Lorsque j'essaye de créer une vingtaine de miniatures (taille maximum 100*100 la miniature) le programme se met à consommer plus de 500 Mo de mémoire.

J'en déduit donc que le garbage collector ne nettoie pas les bufferedImage (qui contiennent de images assez grandes) malgré mes tentatvies pour forcer la désallocation de mémoire

Si quelqu'un a une idée je suis preneur

Merci d'avance