包装ImageSource以进行Base64图像序列化 [英] Wrap ImageSource for Base64 image serialization
问题描述
我有一个WPF控件,其中包含带有图像的面板.我正在尝试对其进行序列化,以便可以独立加载它,而不必在本地文件夹中包含图像.
I have a WPF control that contains panels with images. I'm trying to serialize this so that it can be loaded standalone without having to have images in a local folder.
我知道我可以将图像存储为Base64字符串,然后可以将其备份,但是我想做的是包装ImageSource类以接受Base64字符串作为源.
I know that I can store the images as a Base64 string and then possibly load that back up, but what I would like to do is wrap the ImageSource class to accept a Base64 string as the source.
我稍微看了一下ImageSource类,我相信我对它的工作原理并不了解.当我在自定义包装类中实现ImageSource时,会得到2种我不清楚的方法:
I looked into the ImageSource class a bit, and I believe I just don't know enough about how it works. When I implement ImageSource in my custom wrapper class I get 2 methods that I'm unclear on:
-
元数据
Metadata
CreateInstanceCore
CreateInstanceCore
我想知道是否有人可以阐明这些方法,或者指出我的方向不会导致我回到MSDN文档中.
I was wondering if anyone could shed some light on these methods, or point me in a direction that doesn't lead me back to MSDN documentation.
推荐答案
此类包装了一个bitmapImage,它是从base64字符串属性初始化的:
This class wraps a BitmapImage which is initialized from a base64 string property:
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<ExceptionEventArgs> 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;
}
}
它可以这样使用:
<Image>
<Image.Source>
<local:Base64BitmapImage Base64Source="..."/>
</Image.Source>
</Image>
这篇关于包装ImageSource以进行Base64图像序列化的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!