Удаление изображения, которое использовалось элементом управления WPF
-
19-09-2019 - |
Вопрос
Я хотел бы привязать изображение к какому-нибудь элементу управления и удалить его позже.
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);
Теперь, после этого кода, я хотел бы удалить файл :
fi.Delete();
Но я не могу этого сделать, так как изображение используется сейчас.Между фрагментами кода 1 и 2, что я могу сделать, чтобы освободить его?
Решение
скопируйте изображение в MemoryStream перед отправкой в imagesource оно должно выглядеть следующим образом
BitmapImage bi = new BitmapImage();
bi.BeginInit();
bi.DecodePixelWidth = 30;
bi.StreamSource = byteStream;
bi.EndInit();
где byteStream - это копия файла в MemoryStream
также это может быть полезным
Другие советы
Вы могли бы использовать MemoryStream
но это фактически приводит к пустой трате памяти, потому что в оперативной памяти хранятся две отдельные копии растровых данных:Когда вы загружаете MemoryStream
вы делаете одну копию, и когда растровое изображение декодируется, создается другая копия.Еще одна проблема с использованием MemoryStream
таким образом, вы обходите кэш.
Лучший способ сделать это - прочитать непосредственно из файла, используя 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 };
Это решение также эффективно и просто.
Примечание:Если вы действительно хотите обойти кэш, например, из-за того, что изображение может меняться на диске, вам также следует установить CreateOption = BitmapCreateOption.IgnoreImageCache
.Но даже в этом случае это решение превосходит MemoryStream
решение, потому что оно не хранит две копии данных изображения в оперативной памяти.