41 votes

C# - La sortie de l'image vers le flux de sortie de la réponse donne lieu à une erreur GDI+.

Lors de la sortie d'une image sur le flux de sortie, celle-ci nécessite-t-elle un stockage temporaire ? J'obtiens l'erreur "GDI+ générique" qui est généralement associée à une erreur de permission de dossier lorsque je sauvegarde 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 j'édite l'image directement sans modifications. Par exemple, en faisant ceci, j'obtiens 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 bien sur ma machine locale sous Windows 7 avec IIS 7.5 et ASP.NET 2.0. Le problème se produit sur le serveur d'assurance qualité qui fonctionne sous 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

90voto

Mark Cidade Points 53945

Le format PNG doit être enregistré dans un flux consultable. L'utilisation d'un MemoryStream 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);
   }
}

10voto

oamilkar Points 96

Je voudrais juste ajouter

Response.ContentType = "image/png" ;

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X