将字节数组转换为位图图像

问题描述 投票:0回答:2

我将把字节数组转换为

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;
 }
c# wpf arrays bitmapimage
2个回答
81
投票

在第一个代码示例中,在实际加载图像之前关闭流(通过保留

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。


4
投票

在第一种情况下,您在

MemoryStream
块中定义了
using
,这会导致当您走出该块时该对象将被释放。因此,您返回一个带有处置(且不存在)流的
BitmapImage

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

© www.soinside.com 2019 - 2024. All rights reserved.