Creación de WPF BitmapImage desde MemoryStream png, gif

Tengo problemas para crear una BitmapImage desde un MemoryStream partir de bytes png y gif obtenidos de una solicitud web. Parece que los bytes están bien descargados y el objeto BitmapImage se crea sin problemas, sin embargo, la imagen no se está procesando en mi UI. El problema solo ocurre cuando la imagen descargada es de tipo png o gif (funciona bien para jpeg).

Aquí hay un código que demuestra el problema:

 var webResponse = webRequest.GetResponse(); var stream = webResponse.GetResponseStream(); if (stream.CanRead) { Byte[] buffer = new Byte[webResponse.ContentLength]; stream.Read(buffer, 0, buffer.Length); var byteStream = new System.IO.MemoryStream(buffer); BitmapImage bi = new BitmapImage(); bi.BeginInit(); bi.DecodePixelWidth = 30; bi.StreamSource = byteStream; bi.EndInit(); byteStream.Close(); stream.Close(); return bi; } 

Para probar que la solicitud web estaba obteniendo correctamente los bytes intenté lo siguiente, que guarda los bytes en un archivo en el disco y luego carga la imagen usando un UriSource lugar de un StreamSource y funciona para todos los tipos de imágenes:

 var webResponse = webRequest.GetResponse(); var stream = webResponse.GetResponseStream(); if (stream.CanRead) { Byte[] buffer = new Byte[webResponse.ContentLength]; stream.Read(buffer, 0, buffer.Length); string fName = "c:\\" + ((Uri)value).Segments.Last(); System.IO.File.WriteAllBytes(fName, buffer); BitmapImage bi = new BitmapImage(); bi.BeginInit(); bi.DecodePixelWidth = 30; bi.UriSource = new Uri(fName); bi.EndInit(); stream.Close(); return bi; } 

¿Alguien tiene luz para brillar?

Agregue bi.CacheOption = BitmapCacheOption.OnLoad directamente después de su .BeginInit() :

 BitmapImage bi = new BitmapImage(); bi.BeginInit(); bi.CacheOption = BitmapCacheOption.OnLoad; ... 

Sin esto, BitmapImage utiliza la inicialización diferida de forma predeterminada y la transmisión se cerrará para entonces. En el primer ejemplo, intenta leer la imagen de MemoryStream, posiblemente recogido en la basura, cerrado o incluso desechado. El segundo ejemplo usa el archivo, que todavía está disponible. Además, no escribas

 var byteStream = new System.IO.MemoryStream(buffer); 

mejor

 using (MemoryStream byteStream = new MemoryStream(buffer)) { ... } 

Estoy usando este código:

 public static BitmapImage GetBitmapImage(byte[] imageBytes) { var bitmapImage = new BitmapImage(); bitmapImage.BeginInit(); bitmapImage.StreamSource = new MemoryStream(imageBytes); bitmapImage.EndInit(); return bitmapImage; } 

Puede ser que deberías eliminar esta línea:

 bi.DecodePixelWidth = 30;