Usted podría utilizar a MemoryStream
pero que en realidad desperdicia memoria porque se guardan dos copias separadas de los datos del mapa de bits en la RAM: cuando carga el MemoryStream
, realiza una copia y cuando el mapa de bits se decodifica, se realiza otra copia. Otro problema con el uso de MemoryStream
de esta manera es que omite la 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 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 conserva dos copias de los datos de imagen en la RAM.
Tx, funciona. Para lectores posteriores: lo he copiado en un flujo de memoria como este: MemoryStream byteStream = new MemoryStream (File.ReadAllBytes (path)); – Peter
Sí, funciona, ** pero es ineficiente ** porque: 1. Se guardan para siempre dos copias de los datos de imagen, y 2. La memoria caché se puentea para que la imagen se cargue incluso si ya está en la RAM. El artículo vinculado explica una solución para el # 1, pero requiere una gran cantidad de código adicional y aún no resuelve # 2. Una solución mucho mejor es 'BitmapCacheOption.OnLoad' combinada con' BeginInit/EndInit'. –
¿No puedes cerrar la secuencia de memoria después del 'EndInit'? ¿Por qué necesitarías mantener ambos? – Jordan