Подтвердить что ты не робот

С# - вывод изображения в выходной поток ответа, дающий ошибку GDI +

При выводе изображения в выходной поток требуется ли временное хранилище? Я получаю "общую ошибку GDI +", которая обычно связана с ошибкой разрешения папки при сохранении изображения в файл.

Единственное, что я делаю с изображением, это добавить текст. Я все еще получаю ошибку, даже когда я выводил изображение без изменений. Например, это приведет к ошибке:

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

Все работает отлично на моей локальной машине под управлением Windows 7 с IIS 7.5 и ASP.NET 2.0. Проблема возникает на сервере QA, который работает под управлением Windows Server 2003 с IIS 6 и ASP.NET 2.0.

Линия, указывающая на ошибку:

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
4b9b3361

Ответ 1

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

Ответ 2

Я бы добавил:

Response.ContentType = "image/png";

Поэтому его можно просмотреть непосредственно в браузере, если он не находится в теге img.