2012-12-14 46 views
0

我試圖從網站下載圖像,將它們轉換爲base-64字符串,以便它們可以序列化爲文件,反序列化,從base-64字符串轉換到System.Drawing.Image,最後轉換爲System.Windows.Media.ImageSource,以便它們可以綁定到我的用戶界面。下載圖像,序列化爲base-64字符串,轉換爲ImageSource

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字符串轉換爲圖像。

+0

http://stackoverflow.com/questions/5813633/a-generic- error-occurrence-at-gdi-at-bitmap-save-after-using-savefiledialog – Nathan

+0

另外,我很困惑,爲什麼你要序列化到一個字符串呢?將圖像直接保存爲二進制文件似乎很簡單。 – Nathan

+0

我使用的是Protobuf-net,它不支持序列化圖像。 – Brett

回答

1

我不確定您的特殊例外情況(除非與A Generic error occurs at GDI+ at Bitmap.Save() after using SaveFileDialog有關),但還有其他選擇。

你可能有更好的運氣,直接從基地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]; 
    } 
} 
+0

這工作很好,並簡化了一些事情。 – Brett

相關問題