jerome_
Messages postés10Date d'inscriptionmercredi 11 février 2004StatutMembreDernière intervention13 août 2010
-
12 août 2010 à 16:01
jerome_
Messages postés10Date d'inscriptionmercredi 11 février 2004StatutMembreDernière intervention13 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.
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
jerome_
Messages postés10Date d'inscriptionmercredi 11 février 2004StatutMembreDernière intervention13 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.
// 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 ^^