包装ImageSource以进行Base64图像序列化 [英] Wrap ImageSource for Base64 image serialization

查看:383
本文介绍了包装ImageSource以进行Base64图像序列化的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个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:

  1. 元数据

  1. 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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆