以XML格式保存ImageSource(BitmapSource)

时间:2012-11-16 20:16:53

标签: c# wpf image xml-serialization

我正在尝试在XML文件中保存并加载ImageSource(或BitmapSource)。快速查看SO给了我this answer

看起来不错,所以我试了一下,但结果很奇怪。

当我尝试这段代码时,一切正常:

BitmapSource testImgSrc = new WriteableBitmap(new BitmapImage(new Uri("pack://application:,,,/MyNameSpace;component/Images/MyImg.png")));
BackgroundImage = testImgSrc;

但是当我尝试这段代码时,图像根本就不会出现:

BitmapSource testImgSrc = new WriteableBitmap(new BitmapImage(new Uri("pack://application:,,,/MyNameSpace;component/Images/MyImg.png")));
string testImgStr = ImageToBase64(testImgSrc);
BitmapSource testImg = Base64ToImage(testImgStr);
BackgroundImage = testImg;

似乎没有任何错误或例外。逐步执行代码BackgroundImage看起来像是设置为有效的图像对象。

我的WPF表单有一个图像控件,它的源绑定到一个返回BackgroundImage属性结果的属性。我猜测绑定工作正常,因为第一个测试按预期工作。

任何人都可以帮助我理解为什么第二次测试没有显示我的图像吗?

1 个答案:

答案 0 :(得分:4)

来自this answerBase64ToImage方法存在问题。 documentation表示使用默认的OnDemand缓存选项,在实际使用图像之前,不得关闭流。在您的情况下,这意味着Image元素正在尝试访问已经处置的流。

修复非常简单,您只需将缓存选项更改为OnLoad,问题就消失了:

BitmapSource Base64ToImage(string base64)
{
    byte[] bytes = Convert.FromBase64String(base64);
    using (var stream = new MemoryStream(bytes))
    {
        return BitmapFrame.Create(stream, BitmapCreateOptions.None, BitmapCacheOption.OnLoad);
    }
}