8wDlpd.png
8wDFp9.png
8wDEOx.png
8wDMfH.png
8wDKte.png

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

Moein Kameli 2月前

55 0

我要将字节数组转换为 System.Windows.Media.Imaging.BitmapImage,并在图像控件中显示 BitmapImage。当我使用第一个代码时,没有发生任何事情!没有错误,也没有图像

我将把字节数组转换为 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;
 }
帖子版权声明 1、本帖标题:将字节数组转换为位图图像
    本站网址:http://xjnalaquan.com/
2、本网站的资源部分来源于网络,如有侵权,请联系站长进行删除处理。
3、会员发帖仅代表会员个人观点,并不代表本站赞同其观点和对其真实性负责。
4、本站一律禁止以任何方式发布或转载任何违法的相关信息,访客发现请向站长举报
5、站长邮箱:yeweds@126.com 除非注明,本帖由Moein Kameli在本站《wpf》版块原创发布, 转载请注明出处!
最新回复 (0)
  • ,在实际加载图像之前, 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 :

    如果您希望在创建 BitmapImage 之后关闭流,请将 CacheOption 属性设置为 BitmapCacheOption.OnLoad。


    除此之外,您还可以使用内置类型转换来从类型转换为 byte[] 类型 ImageSource (或派生类型 BitmapSource ):

    var bitmap = (BitmapSource)new ImageSourceConverter().ConvertFrom(array);
    

    当你将类型的属性 ImageSource (例如,Image 控件的 Source 属性)绑定到类型的源属性 string , Uri byte[] .

  • 您提到了关于 CacheOption 的一个非常好的观点,但在您的代码中,MemroyStream 仍将在加载图像之前被释放。除非调用 EndInit() 加载图像。是这样吗?

  • 是的,BitmapCacheOption.OnLoad 就是这样做的。图像在 EndInit 期间同步加载。因此,在图像加载之前不会处理流。

  • 非常好。我不知道 CacheOption 的这一点。我修改了我的代码,它工作正常。

  • mt1 2月前 0 只看Ta
    引用 6

    我希望这是 JWTDO,但在 Windows 应用商店应用中,我得到了“Error1”Windows.UI.Xaml.Media.Imaging.BitmapImage“不包含“BeginInit”的定义,并且找不到接受类型为“Windows.UI.Xaml.Media.Imaging.BitmapImage”的第一个参数的扩展方法“BeginInit”(您是否缺少使用……\'

  • Windows 运行时和 WPF 是两个不同的框架。Windows 运行时中没有 BeginInit 和 EndInit。只需调用 SetSourceAsync 即可。

  • 在第一种情况下,您 MemoryStream 在一个 using 块中定义了您的,这会导致在您离开该块时对象被处置。因此您返回一个 BitmapImage 带有处置(和不存在)流的。

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

  • 请参阅有关不处置 MemoryStream 的答案。这至少被认为是不好的做法。

返回
作者最近主题: