Suppression d'une image qui a été utilisé par un contrôle WPF
-
19-09-2019 - |
Question
Je voudrais lier une image à une sorte de contrôle une supprimer ultérieurement.
path = @"c:\somePath\somePic.jpg"
FileInfo fi = new FileInfo(path);
Uri uri = new Uri(fi.FullName, UriKind.Absolute);
var img = new System.Windows.Controls.Image();
img.Source = new BitmapImage(uri);
Maintenant, après ce code, je voudrais supprimer le fichier:
fi.Delete();
Mais je ne peux pas le faire puisque l'image est utilisée maintenant. Entre fragment de code 1 en 2 ce que je peux faire pour le libérer?
La solution
copier l'image à MemoryStream avant de donner à ImageSource il devrait ressembler à ceci
BitmapImage bi = new BitmapImage();
bi.BeginInit();
bi.DecodePixelWidth = 30;
bi.StreamSource = byteStream;
bi.EndInit();
où ByteStream est une copie du fichier dans MemoryStream
cette peut être utile
Autres conseils
Vous pouvez utiliser un MemoryStream
mais que les déchets réellement mémoire parce que deux copies séparées des données bitmap sont conservées dans la mémoire vive: Lorsque vous chargez le MemoryStream
vous faites une copie, et lorsque le bitmap est décodé une autre copie. Un autre problème avec l'utilisation MemoryStream
de cette manière est que vous contournez le cache.
La meilleure façon de le faire est de lire directement à partir du fichier en utilisant BitmapCacheOptions.OnLoad:
path = @"c:\somePath\somePic.jpg"
var source = new BitmapImage();
source.BeginInit();
source.UriSource = new Uri(path, UriKind.RelativeOrAbsolute);
source.CacheOption = BitmapCacheOption.OnLoad;
source.EndInit(); // Required for full initialization to complete at this time
var img = new System.Windows.Controls.Image { Source = source };
Cette solution est simple et efficace aussi.
Remarque: Si vous ne voulez réellement contourner le cache, par exemple parce que l'image peut changer sur le disque, vous devez également définir CreateOption = BitmapCreateOption.IgnoreImageCache
. Mais même dans ce cas, cette solution surclasse la solution MemoryStream
parce qu'il ne tient pas deux copies des données d'image dans la mémoire vive.