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