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

这是我的代码:

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字符串。有人有什么建议吗?谢谢!

347424 次浏览

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

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 语句中)。

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

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

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

我建议通过位图:

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

这就是我的结论。

    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);
}

在一个类似的场景中,对我起作用的是以下几点:

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

ImageTagId是 ASP 图像标记的 ID。

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

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

在我的例子中,它只能处理两行代码。测试下面的 C # 代码:

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


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

就是这样。如果你真的发现这个解决方案对你有效,请投票。预先感谢。

下面是将图像从 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();
}
}
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;
}


}

使用 MemoryStream不是一个好主意,并且违反了 MSDN 中针对 Image.FromStream()的规范

您必须在 Image 的生存期内保持流处于打开状态。

一个更好的解决方案是使用 ImageConverter,例如:

public Image ConvertBase64ToImage(string base64)
=> (Bitmap)new ImageConverter().ConvertFrom(Convert.FromBase64String(base64));


在 NetCore6.0中,可以在新的 File类中使用 HttpClient 和异步方法。

实现过程非常简单:

static async Task DownloadFile(string imageUrl, string pathToSave)
{
var content = await GetUrlContent(url);
if (content != null)
{
await File.WriteAllBytesAsync(pathToSave, content);
}
}


static async Task<byte[]?> GetUrlContent(string url)
{
using (var client = new HttpClient())
using (var result = await client.GetAsync(url))
return result.IsSuccessStatusCode ? await result.Content.ReadAsByteArrayAsync():null;
}

用法:

await DownloadFile("https://example.com/image.jpg", @"c:\temp\image.jpg");