Wpf 是否将内存流转换为位图图像?

Wpf 是否将内存流转换为位图图像?,wpf,Wpf,我有一个最初是PNG的图像,我已将其转换为字节[],并保存在数据库中。最初,我只是将PNG读入内存流,并将该流转换为字节[]。现在我想读回字节[],并将其转换为BitmapImage,以便可以将WPF图像控件绑定到它 我在网上看到了许多相互矛盾、令人困惑的代码,以完成将字节[]转换为位图图像的任务。我不确定是否需要添加任何代码,因为该图像最初是PNG 如何将流转换为位图图像 这应该可以做到: using (var stream = new MemoryStream(data)) { va

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

我在网上看到了许多相互矛盾、令人困惑的代码,以完成将字节[]转换为位图图像的任务。我不确定是否需要添加任何代码,因为该图像最初是PNG

如何将流转换为位图图像

这应该可以做到:

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将处理它。

来自另一个SO问题:这样做有效吗?关于
BitmapCacheOption的此位可能重复。OnLoad
非常重要。向上投票,谢谢。为什么要位图。冻结()?如何设置流中图像的类型?如果您能解释一下为什么此代码有助于回答用户的问题,这将非常有用。
 using (var stream = new MemoryStream(data))
        {
          var bi = BitmapFrame.Create(stream , BitmapCreateOptions.IgnoreImageCache, BitmapCacheOption.OnLoad);
        }