[英]Convert Base64 String To Image Attachment
我将图像转换为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" />
在将其转换回时,我一定做错了,但我一直无法弄清楚这个问题。 感谢您对此的任何帮助!
Image.FromStream(Stream)
说,“您必须在Image的生存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)
没有提到您需要保持流打开,但我可以肯定地说这是特定页面上的错误。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.