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

将字节数组转换为bitmapimage

在第一个代码示例中,流在实际加载图像之前被关闭(通过离开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属性)到stringUribyte[]类型的源属性时被隐式调用。

在第一种情况下,您在using块中定义了MemoryStream,这会导致在您离开块时处置对象。所以你返回一个BitmapImage与处置(和不存在)流。

MemoryStream s不保留未管理的资源,因此您可以留下内存并让GC处理释放过程(但这不是一个好的做法)。