web-dev-qa-db-fra.com

C # - Sortie de l'image vers le flux de sortie de réponse donnant une erreur GDI +

Lors de la sortie d'une image dans le flux de sortie, cela nécessite-t-il un stockage temporaire? J'obtiens l'erreur "GDI + générique" qui est généralement associée à une erreur d'autorisation de dossier lors de l'enregistrement d'une image dans un fichier.

La seule chose que je fais à l'image est d'ajouter du texte. J'obtiens toujours l'erreur même lorsque je renvoie l'image directement sans modifications. Par exemple, cela me donnera l'erreur:

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

Tout fonctionne correctement sur ma machine locale exécutant Windows 7 avec IIS 7.5 et ASP.NET 2.0. Le problème se produit sur le serveur QA qui exécute Windows Server 2003 avec IIS 6 et ASP.NET 2.0.

La ligne qui donne l'erreur est:

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

Voici la trace de la pile:

[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
41
Daniel

Les fichiers PNG (et autres formats) doivent être enregistrés dans un flux recherché. L'utilisation d'un MemoryStream intermédiaire fera l'affaire:

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);
   }
}
90
Mark Cidade

J'ajouterais simplement:

Response.ContentType = "image/png";

Il peut donc être affiché directement dans le navigateur lorsqu'il ne se trouve pas dans une balise img.

10
oamilkar