【发布时间】:2018-03-01 20:01:51
【问题描述】:
我有一个转换为 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" />
我在将其转换回来时一定做错了,但我无法找出问题所在。感谢您对此的任何帮助!
【问题讨论】:
-
你确定图片有“
color management information embedded in the data stream”吗?也许您只想“验证图像”,在这种情况下使用 this overload 和false嵌入颜色:Image.FromStream(ms, false, true);。 -
我尝试了
Image.FromStream(ms, false, true)和Image.FromStream(ms),但在Image.Save(ms, ImageFormat.Png)上仍然得到相同的A generic error occurred in GDI+.错误 -
认为我在阅读here 时发现了您的问题,您没有使用
Bitmap,但Image.FromStream()也会发生同样的事情:“您必须在图像的生命周期内保持流打开”。但是,您是usingMemoryStream,因此在返回图像时将其处置,一旦发生这种情况,Image将不再可用。也许你的静态类需要返回Tuple<Image, MemoryStream>。 -
确实是这个问题,非常感谢!如果您将此作为答案发布,我可以接受。
标签: c# asp.net-mvc base64 image-conversion