0

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

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)时,似乎没有正确创建图像并且无法读取/打开。

有没有更好、更通用的方法System.Drawing.Image从这个 Html 字符串中获取 C#?或者我只是错过了一些简单的 base64 字符串是如何传递的?

编辑 我迟到了,错过了一些关于代码示例的重要信息,我正在剥离元数据。我现在已经更新了。到填充字符串imageBase64String时,我已经删除了元数据。

4

2 回答 2

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);
于 2018-03-18T23:59:11.543 回答
0

通过一个简单的改变,我已经设法让这个工作正常。我没有尝试从字节数组创建System.Drawing.Image对象并保存它,而是发现使用:

File.WriteAllBytes(fileLocation, bytes);

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

于 2018-03-19T10:51:57.107 回答