0

我正在尝试从网站下载图像,将它们转换为 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)当inConvert()被击中时,我得到了这个相当无益的异常:

System.Drawing.dll 中出现“System.Runtime.InteropServices.ExternalException”类型的异常,但未在用户代码中处理

附加信息:GDI+ 中出现一般错误。

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

4

1 回答 1

1

我不确定您的特定异常(除非它与使用 SaveFileDialog 后在 Bitmap.Save() 的 GDI+ 处发生 A Generic error相关),但还有另一种选择。

您可能有更好的运气直接从 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];
    }
} 
于 2012-12-14T03:40:20.333 回答