【问题标题】:Convert memory stream to BitmapImage?将内存流转换为 BitmapImage?
【发布时间】:2011-07-17 19:58:36
【问题描述】:

我有一个最初是 PNG 的图像,我已将其转换为 byte[] 并保存在数据库中。最初,我只是简单地将 PNG 读入内存流,然后将流转换为 byte[]。现在我想读回 byte[] 并将其转换为 BitmapImage,以便我可以将 WPF Image 控件绑定到它。

我在网上看到很多相互矛盾和令人困惑的代码来完成将 byte[] 转换为 BitmapImage 的任务。由于图像最初是 PNG,我不确定是否需要添加任何代码。

如何将流转换为 BitmapImage?

【问题讨论】:

标签: wpf


【解决方案1】:

应该这样做:

using (var stream = new MemoryStream(data))
{
    var bitmap = new BitmapImage();
    bitmap.BeginInit();
    bitmap.StreamSource = stream;
    bitmap.CacheOption = BitmapCacheOption.OnLoad;
    bitmap.EndInit();
    bitmap.Freeze();
}

BitmapCacheOption.OnLoad 在这种情况下很重要,否则 BitmapImage 可能会在按需加载时尝试访问流并且流可能已经关闭。

冻结位图是可选的,但如果您确实冻结它,您可以跨线程共享位图,否则这是不可能的。

您不必对图像格式做任何特殊处理 - BitmapImage 会处理它。

【讨论】:

  • 关于BitmapCacheOption.OnLoad 的这一点非常重要。点赞,谢谢。
  • 你为什么要 bitmap.Freeze(); ?
  • 如何设置流中图片的类型?
【解决方案2】:
 using (var stream = new MemoryStream(data))
        {
          var bi = BitmapFrame.Create(stream , BitmapCreateOptions.IgnoreImageCache, BitmapCacheOption.OnLoad);
        }

【讨论】:

  • 如果您能解释为什么此代码有助于回答用户的问题,将会很有帮助。
  • 扩展这个答案:BitmapFrame 继承自 BitmapSource 并且它有一个接受流作为源的工厂方法(如上所示)。
猜你喜欢
  • 1970-01-01
  • 2020-04-12
  • 1970-01-01
  • 2011-08-28
  • 2017-12-03
  • 2012-12-08
  • 1970-01-01
  • 2018-02-19
  • 1970-01-01
相关资源
最近更新 更多