我正在尝试在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
属性结果的属性。我猜测绑定工作正常,因为第一个测试按预期工作。
任何人都可以帮助我理解为什么第二次测试没有显示我的图像吗?
答案 0 :(得分:4)
来自this answer的Base64ToImage
方法存在问题。 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);
}
}