下载图像,序列化为 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的主要内容,如果未能解决你的问题,请参考以下文章