У меня есть изображение, преобразованное в строку 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;
}
}
}
Я могу обслуживать необработанную строку base64 в другом месте, используя тег img, и он работает нормально, поэтому я уверен, что проблема не в самой строке base64:
<img src="data:image/png;base64,<myBase64StringHere>" alt="My Image" width="500" />
Я, должно быть, делаю что-то неправильно при преобразовании его обратно, но я не смог понять проблему. Спасибо за любую помощь в этом!
color management information embedded in the data stream
? Возможно, вы хотели только проверить образ, и в этом случае используйте эта перегрузка сfalse
для встроенных цветов:Image.FromStream(ms, false, true);
. - person Quantic   schedule 25.10.2016Image.FromStream(ms, false, true)
, так иImage.FromStream(ms)
, но все равно получаю ту же ошибкуA generic error occurred in GDI+.
наImage.Save(ms, ImageFormat.Png)
- person Elliot Starks   schedule 25.10.2016Bitmap
, но то же самое происходит сImage.FromStream()
: поток должен оставаться открытым в течение всего времени жизни изображения. Однако вы являетесьusing
MemoryStream, поэтому он удаляется по мере возврата изображения, и как только это происходит,Image
больше нельзя использовать. Возможно, ваш статический класс должен возвращатьTuple<Image, MemoryStream>
. - person Quantic   schedule 25.10.2016