Получить 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);
Другие вопросы по тегам