获取RTF Image Html base64字符串作为System.Drawing.Image

时间:2018-03-18 23:45:43

标签: c# system.drawing.imaging

我在我们的数据库中存储了一个Rich Text html字符串,示例如下(我缩短了位信息):

data:image/png;base64,iVBORw0...ORK5CYII
data:image/jpeg;base64,/9j/4AAQS...TcUQrQf/Z

我需要基本上使用此HTML并在C#中创建System.Drawing.Image,然后将图像保存到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时,似乎图像未正确创建且无法读取/打开。

是否有更好,更通用的方法从此Html字符串中获取C#System.Drawing.Image?或者我只是遗漏了一些简单的base64字符串传递方式?

修改 我迟到了发布这个并错过了关于代码示例的一些重要信息,我正在删除元数据。我现在更新了。当填充字符串 imageBase64String 时,我已经删除了元。

2 个答案:

答案 0 :(得分:1)

您正在破坏图片的数据,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);

答案 1 :(得分:0)

我设法通过简单的更改让这个工作得很好。而不是尝试从字节数组创建 System.Drawing.Image 对象并保存它,我发现使用:

File.WriteAllBytes(fileLocation, bytes);

该作业只是传递原始字节和文件位置。现在我似乎能够保存并打开我需要的任何图像格式。