将 Base64 字符串转换为图像附件
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)
说,"You must keep the stream open for the lifetime of the Image",但是您的 using
语句在图像 returned 时处理流。解决方法是 return 将图像和流一起作为一个元组,并且没有 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 页面上的每个重载。通常我会说,"view the most encompassing overload to get all the remarks and notes",但在这种情况下,情况并非如此。最大过载的 MSDN 页面 Image.FromStream Method (Stream, Boolean, Boolean)
确实 没有 提到你需要保持流打开,但我相当肯定那是那个特定页面上的错误。
我有一个图像转换为 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)
说,"You must keep the stream open for the lifetime of the Image",但是您的 using
语句在图像 returned 时处理流。解决方法是 return 将图像和流一起作为一个元组,并且没有 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 页面上的每个重载。通常我会说,"view the most encompassing overload to get all the remarks and notes",但在这种情况下,情况并非如此。最大过载的 MSDN 页面 Image.FromStream Method (Stream, Boolean, Boolean)
确实 没有 提到你需要保持流打开,但我相当肯定那是那个特定页面上的错误。