[英]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.