Skip to main content
 首页 » 编程设计

c#之在 XML 中保存 ImageSource (BitmapSource)

2024年02月20日32JeffreyZhao

我正在尝试在 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 表单有一个图像控件,它的源代码绑定(bind)到一个返回 BackgroundImage 属性结果的属性。我猜绑定(bind)工作正常,因为第一个测试按预期工作。

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

请您参考如下方法:

来自 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); 
    } 
}