包装ImageSource以进行Base64图像序列化

我有一个WPF控件,其中包含带图像的面板。 我正在尝试序列化这个,以便它可以独立加载,而不必在本地文件夹中有图像。

我知道我可以将图像存储为Base64字符串然后可能将其加载备份,但我想要做的是将ImageSource类包装为接受Base64字符串作为源。

我稍微调查了ImageSource类,我相信我对它的工作方式还不太了解。 当我在自定义包装器类中实现ImageSource时,我得到了两个我不清楚的方法:

  1. 元数据

  2. CreateInstanceCore

我想知道是否有人可以对这些方法有所了解,或者指出我的方向不会导致我回到MSDN文档。

此类包装一个从base64字符串属性初始化的BitmapImage:

public class Base64BitmapImage : BitmapSource { private BitmapImage bitmap; private string base64Source; public string Base64Source { get { return base64Source; } set { base64Source = value; bitmap = new BitmapImage(); if (DecodeFailed != null) { bitmap.DecodeFailed += DecodeFailed; } using (var stream = new MemoryStream(Convert.FromBase64String(base64Source))) { bitmap.BeginInit(); bitmap.CacheOption = BitmapCacheOption.OnLoad; bitmap.StreamSource = stream; bitmap.EndInit(); } if (DecodeFailed != null) { bitmap.DecodeFailed -= DecodeFailed; } bitmap.Freeze(); } } public override event EventHandler DecodeFailed; public override bool IsDownloading { get { return false; } } public override PixelFormat Format { get { return bitmap != null ? bitmap.Format : base.Format; } } public override double DpiX { get { return bitmap != null ? bitmap.DpiX : base.DpiX; } } public override double DpiY { get { return bitmap != null ? bitmap.DpiY : base.DpiY; } } public override double Width { get { return bitmap != null ? bitmap.Width : base.Width; } } public override double Height { get { return bitmap != null ? bitmap.Height : base.Height; } } public override int PixelWidth { get { return bitmap != null ? bitmap.PixelWidth : base.PixelWidth; } } public override int PixelHeight { get { return bitmap != null ? bitmap.PixelHeight : base.PixelHeight; } } public override ImageMetadata Metadata { get { return bitmap != null ? bitmap.Metadata : base.Metadata; } } public override void CopyPixels(Array pixels, int stride, int offset) { if (bitmap != null) { bitmap.CopyPixels(pixels, stride, offset); } } public override void CopyPixels(Int32Rect sourceRect, Array pixels, int stride, int offset) { if (bitmap != null) { bitmap.CopyPixels(sourceRect, pixels, stride, offset); } } public override void CopyPixels(Int32Rect sourceRect, IntPtr buffer, int bufferSize, int stride) { if (bitmap != null) { bitmap.CopyPixels(sourceRect, buffer, bufferSize, stride); } } protected override Freezable CreateInstanceCore() { var instance = new Base64BitmapImage(); instance.bitmap = bitmap; instance.base64Source = base64Source; return instance; } } 

它可以像这样使用: