C# - 将图像输出到响应输出流,给出GDI +错误

时间:2011-04-12 01:00:33

标签: c# asp.net gdi+

将图像输出到输出流时,是否需要临时存储?在将图像保存到文件时,我收到通常与文件夹权限错误相关的“通用GDI +”错误。

我对图像所做的唯一一件事就是添加一些文字。即使我直接输出图像而没有修改,我仍然会得到错误。例如,这样做会给我一个错误:

using (Bitmap image = new Bitmap(context.Server.MapPath("images/stars_5.png")))
{
    image.Save(context.Response.OutputStream, System.Drawing.Imaging.ImageFormat.Png);
}

在运行带有IIS 7.5和ASP.NET 2.0的Windows 7的本地计算机上,一切正常。问题出现在运行带有IIS 6和ASP.NET 2.0的Windows Server 2003的QA服务器上。

给出错误的行是:

image.Save(context.Response.OutputStream, System.Drawing.Imaging.ImageFormat.Png);

这是堆栈跟踪:

[ExternalException (0x80004005): A generic error occurred in GDI+.]
   System.Drawing.Image.Save(Stream stream, ImageCodecInfo encoder, EncoderParameters encoderParams) +378002
   System.Drawing.Image.Save(Stream stream, ImageFormat format) +36
   GetRating.ProcessRequest(HttpContext context) in d:\inetpub\wwwroot\SymInfoQA\Apps\tools\Rating\GetRating.ashx:54
   System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +181
   System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +75

2 个答案:

答案 0 :(得分:89)

需要将PNG(和其他格式)保存到可搜索的流中。使用中间MemoryStream可以解决问题:

using (Bitmap image = new Bitmap(context.Server.MapPath("images/stars_5.png")))
{
   using(MemoryStream ms = new MemoryStream())
   {
      image.Save(ms, System.Drawing.Imaging.ImageFormat.Png);
      ms.WriteTo(context.Response.OutputStream);
   }
}

答案 1 :(得分:9)

我只想补充一下:

Response.ContentType = "image/png";

因此,当浏览器不在img标记内时,可以直接在浏览器中查看。