下载图像,序列化为base-64字符串,转换为ImageSource

时间:2012-12-14 01:47:57

标签: c# wpf mvvm

我正在尝试从网站下载图像,将它们转换为base-64字符串,以便将它们序列化为文件,反序列化,从base-64字符串转换为System.Drawing.Image,然后最终转换为System。 Windows.Media.ImageSource,因此它们可以绑定到我的UI。

    public static string ImageToString(Image image)
    {
        using (var ms = new MemoryStream())
        {
            if (image == null)
                image = Properties.Resources.blank_image;

            image.Save(ms, image.RawFormat);
            return Convert.ToBase64String(ms.ToArray());
        }
    }

    public static Image StringToImage(string imageString)
    {
        if (String.IsNullOrEmpty(imageString))
            return Properties.Resources.blank_image;

        var array = Convert.FromBase64String(imageString);
        using (var ms = new MemoryStream(array))
        {
            return Image.FromStream(ms);
        }
    }

    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        if (value == null)
            return null;

        var image = (System.Drawing.Image)value;
        var bitmap = new System.Windows.Media.Imaging.BitmapImage();

        bitmap.BeginInit();

        MemoryStream memoryStream = new MemoryStream();
        image.Save(memoryStream, image.RawFormat);
        memoryStream.Seek(0, System.IO.SeekOrigin.Begin);
        bitmap.StreamSource = memoryStream;

        bitmap.EndInit();

        return bitmap;
    }

image.Save(memoryStream, image.RawFormat)中的Convert()被点击时,我得到了这个相当无用的例外:

  

类型的例外   发生'System.Runtime.InteropServices.ExternalException'   System.Drawing.dll但未在用户代码中处理

     

其他信息:GDI +中发生了一般性错误。

将我的Properties.Resources.blank_image图像转换为ImageSource可以正常工作,但不能将base-64字符串转换为Image。

1 个答案:

答案 0 :(得分:1)

我不确定你的特殊例外情况(除非它与A Generic error occurs at GDI+ at Bitmap.Save() after using SaveFileDialog有关),但还有其他选择。

您可以更好地直接从base 64字符串转换并使用BitmapDecoder.Create(...)

例如:

public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
    if (value == null)
        return null;

    string imageBase64String = (string)value;
    byte[] imageAsBytes = Convert.FromBase64String(imageBase64String);

    using (var ms = new MemoryStream(imageAsBytes))
    {
        var decoder = System.Windows.Media.Imaging.BitmapDecoder.Create(ms, BitmapCreateOptions.None, BitmapCacheOptions.OnLoad);

        return decoder.Frames[0];
    }
}