Удаление изображения, которое использовалось элементом управления WPF - PullRequest
5 голосов
/ 11 марта 2010

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

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

Ответы [ 2 ]

11 голосов
/ 11 марта 2010

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

3 голосов
/ 11 марта 2010

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

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

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

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

...