Удаление Изображения, которое использовалось управлением WPF

Я хотел бы связать Изображение с некоторым управлением удаление его позже.

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, что я могу сделать для выпуска его?

5
задан Jon Seigel 20 March 2010 в 19:44
поделиться

2 ответа

скопируйте изображение в MemoryStream перед передачей в imagesource это должно выглядеть так

BitmapImage bi = new BitmapImage();
bi.BeginInit();
bi.DecodePixelWidth = 30;
bi.StreamSource = byteStream;
bi.EndInit();

где byteStream - копия файла в MemoryStream

также это может быть полезно

3
ответ дан 18 December 2019 в 13:13
поделиться

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

11
ответ дан 18 December 2019 в 13:13
поделиться
Другие вопросы по тегам:

Похожие вопросы: