转换的字节数组的BitmapImage(convert array of bytes to bitm

2019-07-18 06:06发布

我要去的字节数组转换为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;
 }

Answer 1:

在第一个代码示例的流(由离开关闭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属性),以类型的源属性stringUribyte[]



Answer 2:

在第一种情况下,你定义你MemoryStreamusing块,这会导致当你走出块被安置的对象。 所以你返回BitmapImage与处置(和不存在的)流。

MemoryStream ,使其保持没有非托管资源,这样你就可以留下记忆,让GC手柄的释放过程(但是这不是一个好的做法)。



文章来源: convert array of bytes to bitmapimage