将Base64字符串转换为图像附件

问题描述 投票:0回答:1

我有一个图像转换为base64字符串,我需要转换回图像并附加到MailMessage

这是将它从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;
        }
    }
}

我能够使用img标签在其他地方提供原始base64字符串,并且它工作正常,所以我确信问题不在于base64字符串本身:

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

我必须在将其转换回来时做错事,但我无法弄清楚这个问题。感谢您的帮助!

c# asp.net-mvc base64 image-conversion
1个回答
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)没有提到你需要保持流打开,但我相当确定这个特定页面上的错误。

© www.soinside.com 2019 - 2024. All rights reserved.