2016-10-24 27 views
0

画像をbase64文字列に変換して、画像に変換してMailMessageに添付する必要があります。Base64文字列を画像の添付ファイルに変換する

これはbase64文字列からイメージに変換する関連コードです(私はImageオブジェクトをスキップして1つのメモリストリームを使用することができますが、それを実装するいくつかの問題があったと思います)。 MemoryStreamImageを保存しようとすると、一般的な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; 
     } 
    } 
} 

私は他の場所でimgタグを使用して、生のbase64文字列を果たすことができるよ、それは私が問題のISNその確信していますので、正常に動作します「base64文字列自体にT:

<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)がありますか? ) "?たぶんあなたは「イメージを検証する」ことを望んでいました。その場合、[このオーバーロード](https://msdn.microsoft.com/en-us/library/21zw9ah6(v = vs.110).aspx)を 'false '埋め込まれた色のもの:' Image.FromStream(ms、false、true); '。 – Quantic

+0

'Image.FromStream(ms、false、true)'と 'Image.FromStream(ms)'の両方を試しましたが、Image.Save(ms、ImageFormat)では 'GDI +で一般的なエラーが発生しました。 .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を '使っている 'ので、イメージが返されたときにそれが破棄されます。一度起これば、' Image'はもう使えなくなります。たぶん静的クラスは 'Tuple 'を返す必要があります。 – Quantic

答えて

2

Image.FromStream(Stream)は、「イメージの有効期間中はストリームを開いたままにしておく必要がありますが、usingステートメントはImageが返されるときにストリームを廃棄します。この問題を回避するには、タプルとして及び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)ではありません。にストリームを開いたままにする必要があると記載されていますが、その特定のページの間違いであることは間違いありません。

関連する問題