从MemoryStream创buildWPF BitmapImage png,gif

我有一些麻烦,从一个从一个Web请求获得的PNG和GIF字节的MemoryStream创build一个BitmapImage 。 似乎下载的字节好, BitmapImage对象创build没有问题,但图像实际上不是在我的用户界面上呈现。 只有当下载的图像types为PNG或GIF(适用于jpeg)时才会出现此问题。

这里是演示问题的代码:

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

为了testingWeb请求是否正确获取字节,我尝试了以下方法,将字节保存到磁盘上的文件中,然后使用UriSource而不是StreamSource加载图像,并且适用于所有图像types:

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

任何人都有光芒闪耀?

.BeginInit()之后直接添加bi.CacheOption = BitmapCacheOption.OnLoad

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

如果没有这个,BitmapImage默认使用延迟初始化,然后stream将被closures。 在第一个示例中,您尝试从可能的垃圾收集closures或甚至丢弃的MemoryStream中读取图像。 第二个例子使用文件,它仍然可用。 另外,不要写

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

更好

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

我正在使用这个代码:

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

可能是你应该删除这一行:

 bi.DecodePixelWidth = 30;