我将把字节数组转换为
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
块)。您还必须设置 BitmapCacheOption.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中的备注部分:
如果您愿意,请将 CacheOption 属性设置为 BitmapCacheOption.OnLoad 创建 BitmapImage 后关闭流。
除此之外,您还可以使用内置类型转换将类型
byte[]
转换为类型 ImageSource
(或派生的 BitmapSource
):
var bitmap = (BitmapSource)new ImageSourceConverter().ConvertFrom(array);
当您将 ImageSource
类型的属性(例如 Image 控件的
Source
属性)绑定到
string
、
Uri
或
byte[]
类型的源属性时,会隐式调用ImageSourceConverter。
在第一种情况下,您在
MemoryStream
块中定义了 using
,这会导致当您走出该块时该对象将被释放。因此,您返回一个带有处置(且不存在)流的BitmapImage
。
MemoryStream
不保留非托管资源,因此您可以保留内存并让 GC 处理释放过程(但这不是一个好的做法)。