将字节数组转换为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); 

当您将ImageSourcetypes的属性(例如Image控件的Source属性)绑定到string Uribyte[]Source属性时,将隐式调用ImageSource

在第一种情况下,您在一个using块中定义了您的MemoryStream ,当您离开块时会导致该对象被丢弃。 所以你用一个disposes(和不存在的)stream返回一个BitmapImage

MemoryStream不保留非托pipe资源,所以你可以离开内存,让GC处理释放的过程(但这不是一个好习惯)。