以 XML 格式保存 ImageSource (BitmapSource)

Ben*_*Ben 2 c# wpf image xml-serialization

我正在尝试在XML 文件中保存和加载ImageSource(或BitmapSource)。快速浏览一下 SO 给了我这个答案

看起来不错,所以我试了一下,但我得到了一个奇怪的结果。

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

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

但是当我尝试这段代码时,图像根本没有出现:

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;
Run Code Online (Sandbox Code Playgroud)

似乎没有任何错误或异常。当逐步执行代码时,BackgroundImage它看起来像是被设置为一个有效的图像对象。

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

谁能帮我理解为什么第二个测试没有显示我的图像?

Dam*_*Arh 5

这个答案的Base64ToImage方法有问题。该文件指出,使用默认的缓存选项的数据流不能实际使用的图像之前关闭。在您的情况下,这意味着该元素正在尝试访问已处理的流。OnDemandImage

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

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