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

ant*_*liu 115 c# asp.net base64 image-processing

这是我的代码:

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();
            }
        }
}
Run Code Online (Sandbox Code Playgroud)

顶部imageUrl声明采用Base64图像字符串,我想将其转换为图像.我认为我的代码集仅适用于像"www.mysite.com/test.jpg"这样的图像而不适用于Base64字符串.有人有什么建议吗?谢谢!

CRi*_*ice 192

下面是一个示例,您可以修改方法以接受字符串参数.然后用.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;
}
Run Code Online (Sandbox Code Playgroud)

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

  • 是的,这是一个黑色的像素:R0lGODlhAQABAIAAAAAAAAAAACH5BAAAAAAALAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA (49认同)
  • @katmanco我认为黑色像素是作为一个例子提供的.尝试将示例base64字符串替换为您自己的base64字符串 (6认同)
  • 您可能需要添加对 System.Drawing DLL 的引用 (3认同)
  • @Bibin 你是否尝试将图像保存在 using 语句中? (2认同)

INT*_*24h 68

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

string filePath = "MyImage.jpg";
File.WriteAllBytes(filePath, Convert.FromBase64String(base64imageString));
Run Code Online (Sandbox Code Playgroud)

  • 很简单; 简明扼要。美丽。 (3认同)
  • 我尝试了这个和@CRice 的解决方案(使用`Image.Save()`)。两者都有效,但由于某种原因,这个版本使我的文件大小缩小了 30%,图像质量没有明显变化 (2认同)

小智 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);
    }
Run Code Online (Sandbox Code Playgroud)

  • 这给了我一个错误`GDI +中发生的一般错误`描述[这里](http://stackoverflow.com/q/336387/345659).在使用块内移动`image.Save`为我修复了它. (7认同)

Nis*_*mar 8

我建议通过Bitmap:

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

  • 通过位图转换和不通过位图转换有什么区别?谢谢 (3认同)

小智 7

这是将图像从 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();
    }
}
Run Code Online (Sandbox Code Playgroud)


afr*_*409 6

如果您有一串Base64编码的二进制数据,您应该能够执行以下操作:

byte[] encodedDataAsBytes = System.Convert.FromBase64String(encodedData);
Run Code Online (Sandbox Code Playgroud)

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

  • **不?** 抱歉,这是_不正确_。将 Base64 字符串转换为其_二进制等效_不会使其成为图像。(感谢@elliotwesoff 指出了这一点!)而且,_为什么_你提到_二进制数据_?这个问题根本没有提到_binary_,甚至没有提到如何转换它。 (2认同)

Mil*_*eth 6

在我的情况下,它只适用于两行代码.测试下面的C#代码:

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

byte[] imgByteArray = Convert.FromBase64String("your_base64_string");
File.WriteAllBytes(dirPath + imgName, imgByteArray);
Run Code Online (Sandbox Code Playgroud)

而已.如果您确实发现此解决方案适合您,请投票.提前致谢.

  • 这是我的答案的副本(见下文 /sf/answers/2461203391/):) (3认同)

小智 5

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

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

ImageTagId 是ASP图像标记的ID。