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

Posted

技术标签:

【中文标题】下载图像,序列化为 base-64 字符串,转换为 ImageSource【英文标题】:Downloading image, serializing to base-64 string, converting to ImageSource 【发布时间】:2012-12-14 01:47:56 【问题描述】:

我正在尝试从网站下载图像,将它们转换为 base-64 字符串,以便它们可以序列化为文件,反序列化,从 base-64 字符串转换为 System.Drawing.Image,然后最终转换为 System.Drawing.Image。 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;
    

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

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

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

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

【问题讨论】:

***.com/questions/5813633/… 另外,我很困惑为什么你首先要序列化为字符串?将图像直接保存为二进制文件似乎要简单得多。 我正在使用 Protobuf-net,它不支持序列化图像。 【参考方案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];
    
 

【讨论】:

以上是关于下载图像,序列化为 base-64 字符串,转换为 ImageSource的主要内容,如果未能解决你的问题,请参考以下文章

内存使用和操作图像

将图像转换为 Base64 字符串

完整图像资产未转换为 base64 字符串

将图像(按路径选择)转换为 base64 字符串

如何将图像转换为 Base64 字符串,并转换回图像,保存到 azure blob

转换为 base 64 字符串后,iOS 图像方向发生了变化