Excluindo uma imagem que foi usada por um controle WPF
-
19-09-2019 - |
Pergunta
Eu gostaria de ligar uma imagem a algum tipo de controle de uma exclusão mais tarde.
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);
Agora, depois deste código, gostaria de excluir o arquivo:
fi.Delete();
Mas não posso fazer isso, pois a imagem está sendo usada agora. Entre o fragmento de código 1 EN 2 O que posso fazer para lançá -lo?
Solução
copie a imagem para a MemoryStream antes de dar ao imagens que deve parecer assim
BitmapImage bi = new BitmapImage();
bi.BeginInit();
bi.DecodePixelWidth = 30;
bi.StreamSource = byteStream;
bi.EndInit();
Onde o ByTestream é cópia do arquivo no MemoryStream
também isto pode ser útil
Outras dicas
Você poderia usar um MemoryStream
Mas isso realmente desperdiça memória porque duas cópias separadas dos dados do bitmap são mantidas em RAM: quando você carrega o MemoryStream
Você faz uma cópia e, quando o bitmap é decodificado, outra cópia é feita. Outro problema de usar MemoryStream
Dessa maneira, você ignora o cache.
A melhor maneira de fazer isso é ler diretamente do arquivo usando o 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 };
Esta solução também é eficiente e simples.
Nota: Se você realmente deseja ignorar o cache, por exemplo, porque a imagem pode estar mudando no disco, você também deve definir CreateOption = BitmapCreateOption.IgnoreImageCache
. Mas mesmo nesse caso, esta solução supera o MemoryStream
Solução porque não mantém duas cópias dos dados da imagem na RAM.