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?

Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top