2016-10-24 96 views
0

我將圖像轉換爲base64字符串,我需要將其轉換回圖像並附加到MailMessage將Base64字符串轉換爲圖像附件

下面是將其從base64字符串轉換爲圖像的相關代碼(我認爲我可以跳過Image對象並使用一個內存流執行此操作,但遇到了一些問題)。嘗試將Image保存到MemoryStream拋出一個普通的GDI +錯誤:

Image image = ImageHelper.Base64ToImage(attachment.FieldData); 

if (image != null) 
{ 
    using (var ms = new MemoryStream()) 
    { 
     image.Save(ms, ImageFormat.Png); // Throws a generic GDI+ error on Save 

     ms.Position = 0; 

     var imageAttachment = new Attachment(ms, "image.png", "image/png"); 

     message.Attachments.Add(imageAttachment); 
    } 
} 

public static class ImageHelper 
{ 
    public static Image Base64ToImage(string base64String) 
    { 
     if (string.IsNullOrEmpty(base64String)) 
     { 
      return null; 
     } 

     byte[] imageBytes = Convert.FromBase64String(base64String); 

     using (var ms = new MemoryStream(imageBytes, 0, imageBytes.Length)) 
     { 
      ms.Write(imageBytes, 0, imageBytes.Length); 

      Image image = Image.FromStream(ms, true); 

      return image; 
     } 
    } 
} 

我能在其他地方擔任了原始的base64字符串中使用img標籤,它工作得很好,所以我相信這個問題ISN 「t用的base64字符串本身:

<img src="data:image/png;base64,<myBase64StringHere>" alt="My Image" width="500" /> 

我必須做一些錯誤的將其轉換回,但我一直沒能找出問題。感謝您的幫助!

+0

您確定圖像有「嵌入數據流中的顏色管理信息」嗎?(https://msdn.microsoft.com/en-us/library/1kcb3wy4(v = vs.110).aspx )「?也許你只想「驗證圖像」,在這種情況下,使用[this overload](https://msdn.microsoft.com/en-us/library/21zw9ah6(v = vs.110).aspx) '嵌入顏色的東西:'Image.FromStream(ms,false,true);'。 – Quantic

+0

我嘗試了'Image.FromStream(ms,false,true)'和'Image.FromStream(ms)',但仍然得到相同的結果''Image.Save(ms,ImageFormat .Png)' –

+1

想我從閱讀[這裏]找到你的問題(http://stackoverflow.com/questions/336387/image-save-throws-a-gdi-exception-because-the-memory-stream-is-關閉),你沒有使用'Bitmap',但是''Image.FromStream()']發生了同樣的事情(https://msdn.microsoft.com/en-us/library/93z9ee4x(v = vs.110) ).aspx):「您必須保持流在圖像的整個生命週期中打開」。然而,您正在使用MemoryStream,因此在圖像返回時處理它,一旦發生這種情況,圖像不再可用。也許你的靜態類需要返回'Tuple '。 – Quantic

回答

2

Image.FromStream(Stream)說,「您必須保持該流在圖像的整個生命週期中打開」,但是您的using語句在圖像返回時將該流置於該位置。一種解決方法是爲一個元組和沒有using一起返回兩個圖像和流:

public static Tuple<Image, MemoryStream> Base64ToImage(string base64String) 
{ 
    if (string.IsNullOrEmpty(base64String)) 
    { 
     return null; 
    } 

    byte[] imageBytes = Convert.FromBase64String(base64String); 
    var ms = new MemoryStream(imageBytes, 0, imageBytes.Length)   
    ms.Write(imageBytes, 0, imageBytes.Length); 
    Image image = Image.FromStream(ms, true); 

    return new Tuple<Image, MemoryStream>(image, ms); 
} 

還要注意照顧和查看在MSDN頁,每一頁超載。通常我會說,「查看最重要的重載以獲得所有的評論和備註」,但在這種情況下,這是不正確的。最大過載的MSDN頁面,Image.FromStream Method (Stream, Boolean, Boolean)確實不是提到您需要保持該流處於打開狀態,但我相當確定這是該特定頁面上的錯誤。

相關問題