Я хотел бы связать Изображение с некоторым управлением удаление его позже.
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 en 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
, поскольку оно не хранит две копии данных изображения в ОЗУ.