Probleme pour Libérer les ressources d'une image en fond de canvaslors de la sau

Résolu
jerome_ Messages postés 10 Date d'inscription mercredi 11 février 2004 Statut Membre Dernière intervention 13 août 2010 - 12 août 2010 à 16:01
jerome_ Messages postés 10 Date d'inscription mercredi 11 février 2004 Statut Membre Dernière intervention 13 août 2010 - 13 août 2010 à 15:57
Bonjour,

Je développe une appli en C# WPF sous win 7.

J'ai mis une image à l'intérieur d'un canvas afin d'y dessiner dessus et enregistrer l'image modifiée.
Le problème vient lorsque j'essai de sauvegarder sur le même fichier cela me dis : la ressource est en cours d'utilisation.

Pourtant j'ai fais un clear sur le canvas mais cela ne doit pas être suffisant :s

Je ne vois aucune fonction dispose ou close sur mon objet image donc je ne sais pas quoi faire d'autre pour libérer cette image.

J'ai vu un exemple pour libérer la ressource image ici :
http://www.forum.moteurprog.com/Message.php?ID_sujet=29526

Mais étant en WPF je n'ai pas la fonction Image.FromStream.


string fichierOriginal;  // contient le chemin de mon fichier original
InkCanvas canvasPlan; // inkcanvas
...

//affectation de l'image dans le canvas
            Image imageCanvas = new Image();
            imageCanvas.Source = new BitmapImage(new Uri(fichierOriginal, UriKind.RelativeOrAbsolute));
            canvasPlan.Children.Add(imageCanvas);


//sauvegarde apres modifications
            string fichierJpg= @"c:\temp\canvasPlan.jpg";   //fichier temporaire
            ExportToJpeg(fichierJpg, canvasPlan);

//vide le canvas
            /*foreach (Image uneImage in canvasPlan.Children.OfType())
            {
                uneImage.Source = new BitmapImage(); // j'ai essayé d'enlever la source mais ca ne change rien
            }*/
            canvasPlan.Children.Clear();  //supprime les objets a l'intérieur du canvas
            canvasPlan.Strokes.Clear();   //supprime les traits de stylet


//essai d'ecraser le fichier original avec la modif
            File.Copy(fichierJpg, fichierOriginal, true);   //BUG ici : ressource non disponible : fichierOriginal


Merci de votre aide

1 réponse

jerome_ Messages postés 10 Date d'inscription mercredi 11 février 2004 Statut Membre Dernière intervention 13 août 2010
13 août 2010 à 15:57
J'ai fini par trouver en cherchant sur la doc un peu au hasard. j'ai cherché le moyen d'affecter un fichier sous forme de stream a l'image bitmap vu que sur le stream j'ai l'option close dessus.

et j'ai trouvé ce moyen la :

[url]http://msdn.microsoft.com/en-us/library/aa970689.aspx/url


// Open a Stream and decode a JPEG image
Stream imageStreamSource = new FileStream("tulipfarm.jpg", FileMode.Open, FileAccess.Read, FileShare.Read);
JpegBitmapDecoder decoder = new JpegBitmapDecoder(imageStreamSource, BitmapCreateOptions.PreservePixelFormat, BitmapCacheOption.Default);
BitmapSource bitmapSource = decoder.Frames[0];




Ci dessous les modifs qui ont permis de faire marcher le code si ça peut servir à quelqu'un d'autre.



Code C# :

string fichierOriginal; // contient le chemin de mon fichier original
InkCanvas canvasPlan; // inkcanvas
private Stream imageStreamSource = null;
...

//affectation de l'image dans le canvas
this.imageStreamSource = new FileStream(pathImg, FileMode.Open, FileAccess.Read, FileShare.Read);
JpegBitmapDecoder decoder = new JpegBitmapDecoder(imageStreamSource, BitmapCreateOptions.PreservePixelFormat, BitmapCacheOption.Default);
BitmapSource bitmapSource = decoder.Frames[0];

 // Set the image source.
imageCanvas.Source = bitmapSource;/color
canvasPlan.Children.Add(imageCanvas);


//sauvegarde apres modifications
string fichierJpg= @"c:\temp\canvasPlan.jpg"; //fichier temporaire
ExportToJpeg(fichierJpg, canvasPlan);


//vide le canvas
if (imageStreamSource != null)
      this.imageStreamSource.Close();     //libere la ressource sur l'image utilisée
canvasPlan.Children.Clear(); //supprime les objets a l'intérieur du canvas
canvasPlan.Strokes.Clear(); //supprime les traits de stylet


//ecraser le fichier original avec la modif
File.Copy(fichierJpg, fichierOriginal, true); //plus de bug ^^
3
Rejoignez-nous