将字节数组转换为bitmapimage
我打算将字节数组转换为System.Windows.Media.Imaging.BitmapImage
并在图像控件中显示BitmapImage
。
当我使用第一个代码时,注意到会发生! 没有错误,没有图像显示。 但是,当我使用第二个,它工作正常! 任何人都可以说是怎么回事?
第一个代码在这里:
public BitmapImage ToImage(byte[] array) { using (System.IO.MemoryStream ms = new System.IO.MemoryStream(array)) { BitmapImage image = new BitmapImage(); image.BeginInit(); image.StreamSource = ms; image.EndInit(); return image; } }
第二个代码在这里:
public BitmapImage ToImage(byte[] array) { BitmapImage image = new BitmapImage(); image.BeginInit(); image.StreamSource = new System.IO.MemoryStream(array); image.EndInit(); return image; }
在第一个代码示例中,在图像实际加载之前,stream被closures(通过离开using
块)。 您还必须设置BitmapCacheOptions.OnLoad以实现图像立即加载,否则,stream需要保持打开,如第二个示例中所示。
public BitmapImage ToImage(byte[] array) { using (var ms = new System.IO.MemoryStream(array)) { var image = new BitmapImage(); image.BeginInit(); image.CacheOption = BitmapCacheOption.OnLoad; // here image.StreamSource = ms; image.EndInit(); return image; } }
从BitmapImage.StreamSource中的备注部分:
如果您希望在创buildBitmapImage后closuresstream,请将CacheOption属性设置为BitmapCacheOption.OnLoad。
除此之外,还可以使用内置types转换将byte[]
types转换为typesImageSource
(或派生的BitmapSource
):
var bitmap = (BitmapSource)new ImageSourceConverter().ConvertFrom(array);
当您将ImageSource
types的属性(例如Image控件的Source
属性)绑定到string
Uri
或byte[]
的Source
属性时,将隐式调用ImageSource
。
在第一种情况下,您在一个using
块中定义了您的MemoryStream
,当您离开块时会导致该对象被丢弃。 所以你用一个disposes(和不存在的)stream返回一个BitmapImage
。
MemoryStream
不保留非托pipe资源,所以你可以离开内存,让GC处理释放的过程(但这不是一个好习惯)。