我正在尝试从网站下载图像,将它们转换为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。
答案 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];
}
}