将base 64字符串转换为图像并保存


132

这是我的代码:

protected void SaveMyImage_Click(object sender, EventArgs e)
        {
            string imageUrl = Hidden1.Value;
            string saveLocation = Server.MapPath("~/PictureUploads/whatever2.png") ; 


            HttpWebRequest imageRequest = (HttpWebRequest)WebRequest.Create(imageUrl);
            WebResponse imageResponse = imageRequest.GetResponse();

            Stream responseStream = imageResponse.GetResponseStream();

            using (BinaryReader br = new BinaryReader(responseStream))
            {
                imageBytes = br.ReadBytes(500000);
                br.Close();
            }
            responseStream.Close();
            imageResponse.Close();

            FileStream fs = new FileStream(saveLocation, FileMode.Create);
            BinaryWriter bw = new BinaryWriter(fs);
            try
            {
                bw.Write(imageBytes);
            }
            finally
            {
                fs.Close();
                bw.Close();
            }
        }
}

最上面的imageUrl声明接受一个Base64图像字符串,我想将其转换为图像。我认为我的代码集仅适用于“ www.mysite.com/test.jpg”等图像,不适用于Base64字符串。有人有建议吗?谢谢!

Answers:


217

这是一个示例,您可以修改该方法以接受字符串参数。然后只需使用image.Save(...)保存图像对象。

public Image LoadImage()
{
    //data:image/gif;base64,
    //this image is a single pixel (black)
    byte[] bytes = Convert.FromBase64String("R0lGODlhAQABAIAAAAAAAAAAACH5BAAAAAAALAAAAAABAAEAAAICTAEAOw==");

    Image image;
    using (MemoryStream ms = new MemoryStream(bytes))
    {
        image = Image.FromStream(ms);
    }

    return image;
}

A generic error occurred in GDI+.当字节代表位图时,可能会发生异常。如果发生这种情况,请在处理内存流之前保存映像(同时仍在using语句中)。


这种方法给了我黑色的矩形,你有什么主意吗?
katmanco'3

54
是的,这是一个黑色像素:R0lGODlhAQABAIAAAAAAAAAAACH5BAAAAAAALAAAAAABAAEAAAICTAEAOw ==
CRice

6
@katmanco我想以黑色像素为例。尝试将示例base64字符串替换为您自己的base64字符串
kallotec 2015年

2
您可能需要添加对System.Drawing DLL的引用
Philip Rego

1
@Bibin您是否尝试将图像保存在using语句中?
CRice

83

您可以将Base64直接保存到文件中:

string filePath = "MyImage.jpg";
File.WriteAllBytes(filePath, Convert.FromBase64String(base64imageString));

对于我在Linux上使用mono并在Image.Save中使用gdi +遇到一些奇怪行为的情况下,这是一个极好的解决方案。此溶液完全绕过图像/ GDI +(见stackoverflow.com/questions/35783690/...
杰夫阿尔布雷希

1
我尝试了这个和@CRice的解决方案(使用Image.Save())。两者都有效,但是由于某种原因,此版本使我的文件大小减小了30%,而图像质量没有明显变化
Brad Mathews

31

这就是我最后要去的事情。

    private void SaveByteArrayAsImage(string fullOutputPath, string base64String)
    {
        byte[] bytes = Convert.FromBase64String(base64String);

        Image image;
        using (MemoryStream ms = new MemoryStream(bytes))
        {
            image = Image.FromStream(ms);
        }

        image.Save(fullOutputPath, System.Drawing.Imaging.ImageFormat.Png);
    }

7
这给了我这里A generic error occurred in GDI+描述的错误。在用块内部移动对我来说固定了。image.Save
JumpingJezza '16

11

我建议通过位图:

public void SaveImage(string base64)
{
    using (MemoryStream ms = new MemoryStream(Convert.FromBase64String(base64)))
    {
        using (Bitmap bm2 = new Bitmap(ms))
        {
            bm2.Save("SavingPath" + "ImageName.jpg");
        }
    }
}

2
通过位图转换或不通过位图转换有什么区别?THX
胺大。

6

就我而言,它仅适用于两行代码。测试以下C#代码:

String dirPath = "C:\myfolder\";
String imgName = "my_mage_name.bmp";

byte[] imgByteArray = Convert.FromBase64String("your_base64_string");
File.WriteAllBytes(dirPath + imgName, imgByteArray);

而已。如果您真的觉得此解决方案适合您,请进行投票。提前致谢。


1
它是我的答案的副本(请参见以下stackoverflow.com/a/35160048/4190593):)
INT_24h 2015年

-1,因为在字符串之前dirPath必须有一个@符号,即 @"C:\myfolder\"否则您必须在字符串中转义反斜线,即"C:\\myfolder\\"
Marcus Parsons

您应该提供其他答案的参考,而不是完全相信自己
。...– Arshi

6

这是将图像从base64字符串转换为Image对象并将其存储在具有唯一文件名的文件夹中的工作代码:

public void SaveImage()
{
    string strm = "R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7"; 

    //this is a simple white background image
    var myfilename= string.Format(@"{0}", Guid.NewGuid());

    //Generate unique filename
    string filepath= "~/UserImages/" + myfilename+ ".jpeg";
    var bytess = Convert.FromBase64String(strm);
    using (var imageFile = new FileStream(filepath, FileMode.Create))
    {
        imageFile.Write(bytess, 0, bytess.Length);
        imageFile.Flush();
    }
}

5

在类似的情况下,对我有用的是:

byte[] bytes = Convert.FromBase64String(Base64String);    
ImageTagId.ImageUrl = "data:image/jpeg;base64," + Convert.ToBase64String(bytes);

ImageTagId 是ASP图像标记的ID。


5

如果您使用Base64编码的二进制数据字符串,则应该能够执行以下操作:

byte[] encodedDataAsBytes = System.Convert.FromBase64String(encodedData);

您应该能够将结果数组写入文件。


这行不通。它只是将base64字符串转换为其等效的二进制文件。将其写入具有图像扩展名的文件不会使它成为图像。
elliotwesoff

1
没有?抱歉,这是不正确的。将Base64字符串转换为其等效二进制文件不会使其成为映像。(感谢@elliotwesoff指出这一点!)而且,为什么要提到二进制数据?这个问题绝没有提到二进制,甚至没有提到如何转换。
Momoro

0
public bool SaveBase64(string Dir, string FileName, string FileType, string Base64ImageString)
{
    try
    {
        string folder = System.Web.HttpContext.Current.Server.MapPath("~/") + Dir;
        if (!Directory.Exists(folder))
        {
            Directory.CreateDirectory(folder);
        }

        string filePath = folder + "/" + FileName + "." + FileType;
        File.WriteAllBytes(filePath, Convert.FromBase64String(Base64ImageString));
        return true;
    }
    catch
    {
        return false;
    }

}

2
尽管此代码可以解决OP的问题,但最好包含有关您的代码如何解决OP的问题的说明。这样,将来的访问者可以从您的帖子中学习,并将其应用于自己的代码。SO不是编码服务,而是知识资源。而且,更可能会推荐高质量,完整的答案。这些功能以及所有职位必须自成体系的要求,是SO作为平台的强项,可以将其与论坛区分开。您可以编辑以添加其他信息和/或在源文档中补充说明。
ysf
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.