将图像转换为base64,反之亦然

时间:2011-08-30 07:55:48

标签: c# .net asp.net

我想将图像转换为base64并再次返回图像。 这是我到目前为止尝试的代码和错误。有什么建议吗?

public void Base64ToImage(string coded)
{
    System.Drawing.Image finalImage;
    MemoryStream ms = new MemoryStream();
    byte[] imageBytes = Convert.FromBase64String(coded);
    ms.Read(imageBytes, 0, imageBytes.Length);
    ms.Seek(0, SeekOrigin.Begin);
    finalImage = System.Drawing.Image.FromStream(ms);

    Response.ContentType = "image/jpeg";
    Response.AppendHeader("Content-Disposition", "attachment; filename=LeftCorner.jpg");
    finalImage.Save(Response.OutputStream, ImageFormat.Jpeg);
}

错误是:

  

参数无效。

     

描述:执行当前Web请求期间发生了未处理的异常。请查看堆栈跟踪以获取有关错误及其源自代码的位置的更多信息。

     

异常详细信息:System.ArgumentException:参数无效。

     

来源错误:

Line 34:             ms.Read(imageBytes, 0, imageBytes.Length);
Line 35:             ms.Seek(0, SeekOrigin.Begin);
Line 36:             finalImage = System.Drawing.Image.FromStream(ms);
Line 37:         
Line 38:         Response.ContentType = "image/jpeg";
  

源文件:e:\ Practice Projects \ FaceDetection \ Default.aspx.cs Line:36

2 个答案:

答案 0 :(得分:7)

您正在从空流中读取,而不是将现有数据(imageBytes加载到流中。尝试:

byte[] imageBytes = Convert.FromBase64String(coded);
using(var ms = new MemoryStream(imageBytes)) {
    finalImage = System.Drawing.Image.FromStream(ms);
}

此外,您应该努力确保处置finalImage;我建议:

System.Drawing.Image finalImage = null;
try {
    // the existing code that may (or may not) successfully create an image
    // and assign to finalImage
} finally {
    if(finalImage != null) finalImage.Dispose();
}

最后,请注意ASP.NET上的System.Drawing is not supported; YMMV。

  

<强>注意

     

不支持在Windows或ASP.NET服务中使用System.Drawing命名空间中的类。尝试在其中一种应用程序类型中使用这些类可能会产生意外问题,例如服务性能下降和运行时异常。有关支持的替代方法,请参阅Windows Imaging Components。

答案 1 :(得分:2)

MemoryStream.Read MethodMemoryStream中的字节读取到指定的字节数组中。

如果要将字节数组写入MemoryStream,请使用MemoryStream.Write Method

ms.Write(imageBytes, 0, imageBytes.Length);
ms.Seek(0, SeekOrigin.Begin);

或者,您可以简单地将字节数组包装在MemoryStream

MemoryStream ms = new MemoryStream(imageBytes);