С# - вывод изображения в выходной поток ответа, дающий ошибку 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
Ответы
Ответ 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
.