将字节数组转换为bitmapimage
本文关键字:bitmapimage 转换 数组 字节 字节数 | 更新日期: 2023-09-27 17:53:07
我将把字节数组转换为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的comments部分。StreamSource:
设置CacheOption属性为BitmapCacheOption。OnLoad,如果你愿意的话在BitmapImage创建后关闭流。
除此之外,您还可以使用内置类型转换将类型byte[]
转换为类型ImageSource
(或派生的BitmapSource
):
var bitmap = (BitmapSource)new ImageSourceConverter().ConvertFrom(array);
ImageSourceConverter在绑定ImageSource
类型的属性(例如图像控件的Source
属性)到string
、Uri
或byte[]
类型的源属性时被隐式调用。
在第一种情况下,您在using
块中定义了MemoryStream
,这会导致在您离开块时处置对象。所以你返回一个BitmapImage
与处置(和不存在)流。
MemoryStream
s不保留未管理的资源,因此您可以留下内存并让GC处理释放过程(但这不是一个好的做法)。