I have an image converted to a base64 string that I need to convert back to an image and attach to a MailMessage.
Here is the relevant code converting it from base64 string to image (I think I can skip the Image object and do this using one memory stream, but had some issues implementing that). Attempting to save the Image to a MemoryStream throws a generic GDI+ error:
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;
}
}
}
I'm able to serve up the raw base64 string elsewhere using an img tag and it works fine so I'm confident that the problem isn't with the base64 string itself:
<img src="data:image/png;base64,<myBase64StringHere>" alt="My Image" width="500" />
I must be doing something wrong in converting it back, but I haven't been able to figure out the issue. Thanks for any help with this!
color management information embedded in the data stream"? Maybe you only wanted to "validate the image", in which case use this overload withfalsefor the embedded color stuff:Image.FromStream(ms, false, true);.Image.FromStream(ms, false, true)andImage.FromStream(ms), but still get the sameA generic error occurred in GDI+.error onImage.Save(ms, ImageFormat.Png)Bitmap, but the same thing occurs withImage.FromStream(): "You must keep the stream open for the lifetime of the Image". You however areusingthe MemoryStream so it is disposed as the image is returned, and once that happens theImageis no longer usable. Maybe your static class needs to returnTuple<Image, MemoryStream>.