我要去的字节数组转换为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;
}
在第一个代码示例的流(由离开关闭using
块)实际加载的图像之前。 您还必须设置BitmapCacheOptions.OnLoad实现该图像将被立即装载,否则流需要保持开放,在你的第二个例子。
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 :
如果你想创建的BitmapImage后关闭流设置CacheOption属性BitmapCacheOption.OnLoad。
除此之外,你还可以使用内置的类型转换,从类型转换byte[]
输入ImageSource
(或派生BitmapSource
):
var bitmap = (BitmapSource)new ImageSourceConverter().ConvertFrom(array);
当类型的属性绑定ImageSourceConverter被隐式地称为ImageSource
(例如,图像控制的Source
属性),以类型的源属性string
, Uri
或byte[]
在第一种情况下,你定义你MemoryStream
在using
块,这会导致当你走出块被安置的对象。 所以你返回BitmapImage
与处置(和不存在的)流。
MemoryStream
,使其保持没有非托管资源,这样你就可以留下记忆,让GC手柄的释放过程(但是这不是一个好的做法)。