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

StackOverflow https://stackoverflow.com/questions/2423584

  •  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 решение, потому что оно не хранит две копии данных изображения в оперативной памяти.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top