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?

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top