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

Messages postés
10
Date d'inscription
mercredi 11 février 2004
Dernière intervention
13 août 2010
- 12 août 2010 à 16:01 - Dernière réponse :
Messages postés
10
Date d'inscription
mercredi 11 février 2004
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
Afficher la suite 

Votre réponse

1 réponse

Meilleure réponse
Messages postés
10
Date d'inscription
mercredi 11 février 2004
Dernière intervention
13 août 2010
- 13 août 2010 à 15:57
3
Merci
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 ^^

Merci jerome_ 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 87 internautes ce mois-ci

Commenter la réponse de jerome_

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.