Получить RTF-изображение HTML-строки base64 как System.Drawing.Image
Я сохраняю html-строку Rich Text в нашей базе данных, примеры приведены ниже (я сократил информацию о битах):
data:image/png;base64,iVBORw0...ORK5CYII
data:image/jpeg;base64,/9j/4AAQS...TcUQrQf/Z
Мне нужно в основном взять этот HTML и создать System.Drawing.Image
в C#, а затем сохраните изображение в папку в папке Images. В первом примере с png все это, похоже, прекрасно работает со следующим кодом:
string imageBase64String = "iVBORw0...ORK5CYII";
byte[] bytes = Convert.FromBase64String(imageBase64String);
Image image;
using (MemoryStream ms = new MemoryStream(bytes))
{
image = Image.FromStream(ms);
}
string fileNameFull = Guid.NewGuid().ToString() + "." + imageFormat;
string relativePath = @"~\Images\pdfExports\" + fileNameFull;
string fileLocation = HttpContext.Current.Server.MapPath(relativePath);
image.Save(fileLocation);
Однако, когда я пробую другие форматы, включая jpg/jpeg, создается впечатление, что изображение создается неправильно и не может быть прочитано / открыто.
Есть ли лучший, более общий способ получения C# System.Drawing.Image
из этой строки HTML? Или я просто упускаю что-то простое с передачей строки base64?
РЕДАКТИРОВАТЬ Я опоздал опубликовать это и пропустил некоторую жизненно важную информацию на примере кода, где я убираю метаданные. Я обновил сейчас. К тому времени, когда строка imageBase64String заполнена, я уже удалил мета.
2 ответа
Мне удалось заставить это работать нормально с простым изменением. Вместо того, чтобы пытаться создать объект System.Drawing.Image из байтового массива и сохранить его, я обнаружил, используя:
File.WriteAllBytes(fileLocation, bytes);
выполняет работу, просто передавая оригинальные байты и местоположение файла. Теперь я могу сохранять и открывать любой формат изображения, который мне нужен.
Вы повреждаете данные изображения, data:image/png;base64,
Это метаинформация, а не реальное содержимое изображения, вы должны удалить эту информацию перед преобразованием данных в двоичный файл:
string imageBase64String = "data:image/png;base64,iVBORw0...ORK5CYII";
int index = imageBase64String.IndexOf(",");
imageBase64String = imageBase64String .Substring(index + 1);
byte[] bytes = Convert.FromBase64String(imageBase64String);