2011-04-12 6 views
39

Al enviar una imagen a la secuencia de salida, ¿requiere almacenamiento temporal? Aparece el error "GDI genérico +" que generalmente está asociado con el error de permiso de la carpeta al guardar una imagen en un archivo.C# - Salida de la imagen a la secuencia de salida de respuesta con error GDI +

Lo único que le estoy haciendo a la imagen es agregar algo de texto. Aún obtengo el error incluso cuando imprimo la imagen directamente sin modificaciones. Por ejemplo, hacer esto me dará el error:

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

Todo funciona bien en mi máquina local que ejecuta Windows 7 con IIS 7.5 y ASP.NET 2.0. El problema está ocurriendo en el servidor QA que ejecuta Windows Server 2003 con IIS 6 y ASP.NET 2.0.

La línea que está dando el error es:

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

Aquí está el seguimiento de la pila:

[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 
+0

¿Está utilizando algún control de fuente, por casualidad? –

Respuesta

86

PNG (y otros formatos) necesitan ser guardados en una corriente reubicable. El uso de un intermedio MemoryStream hará el truco:

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

¡Dulce, eso funcionó! ¡Gracias, Mark! ¡Tu gran conocimiento me ha salvado el día! – Daniel

+0

¿Qué es el contexto en el código anterior? ¿Alguien me puede decir – Ammar

+0

Esta es la primera respuesta que he visto con ms.writeto, todas las demás soluciones como esta acaba de probar httpResponseMessage response.Content = new StreamContent (ms.toarray()) que no funcionó para mi. ¡buen trabajo! –

9

yo sólo añadiría:

Response.ContentType = "image/png"; 

Por lo tanto, se puede ver directamente en el navegador cuando no está dentro de una etiqueta img.

Cuestiones relacionadas