Creación de WPF BitmapImage desde MemoryStream png, gif
webrequest (2)
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;