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属性。我猜绑定工作正常,因为第一个测试按预期工作。
谁能帮我理解为什么第二个测试没有显示我的图像?
这个答案的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)