Pregunta

Me gustaría enlazar una imagen a algún tipo de control de un borrarla más adelante.

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);

Ahora, después de este código me gustaría borrar el archivo:

fi.Delete();

Pero no puedo hacer eso ya que la imagen se está utilizando ahora. Entre código de fragmento 1 es 2 ¿qué puedo hacer para liberarlo?

¿Fue útil?

Solución

copiar la imagen en MemoryStream antes de dar a Imagesource que debería tener este aspecto

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

donde byteStream es copia del archivo en MemoryStream

también este puede ser útil

Otros consejos

Se puede usar un MemoryStream pero que realmente hace perder la memoria debido a que dos copias separadas de los datos de mapa de bits se mantienen en la memoria RAM: Al cargar el MemoryStream hacer una copia, y cuando se decodifica el mapa de bits se realiza otra copia. Otro problema con el uso MemoryStream de esta manera es que se omite la memoria caché.

La mejor manera de hacer esto es leer directamente desde el archivo usando 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 solución es eficiente y simple también.

Nota: Si realmente no desea omitir la caché, por ejemplo, porque la imagen puede estar cambiando en el disco, también debe establecer CreateOption = BitmapCreateOption.IgnoreImageCache. Pero incluso en ese caso, esta solución supera a la solución MemoryStream porque no mantiene dos copias de los datos de imagen en la memoria RAM.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top