Laden...

Allgemeiner Fehler in GDI+, aber unter Windows XP

Erstellt von schuppsl vor 12 Jahren Letzter Beitrag vor 12 Jahren 2.854 Views
S
schuppsl Themenstarter:in
789 Beiträge seit 2007
vor 12 Jahren
Allgemeiner Fehler in GDI+, aber unter Windows XP

Hallo Profis.

So, jetzt wirds ewas kompliziert.
Ich erstelle in meiner ASP.NET Anwendung auf einer Seite dynamische Grafiken, welche per HttpHandler erzeugt wird.

In der web.config habe ich dazu einen neuen Handler registriert:

<add verb="*" path=".tmbn" type="MEINPROJEKT.V5.thumbnails"></add>

D.h. also alle Images, welche per ImageUrl auf einen Pfad wie in meinem Fall

src=".tmbn/img=|0|0|1|5"

zugreifen, werden mit diesem handler dynamisch erzeugt.

Dieser Handler sieht u.a so aus:


public class thumbnails : IHttpHandler
    {
......

 public void ProcessRequest(HttpContext context)
        {
......

            int areaSize = 28;
            Color colVor = Color.FromArgb(rgbcolorVor);
            Color colNach = Color.FromArgb(rgbcolorNach);


            System.Drawing.Bitmap flag = new System.Drawing.Bitmap(areaSize, areaSize);

            Graphics graf = Graphics.FromImage(flag);
            graf.Clear(Color.White);           
            
            SolidBrush brushVor = new SolidBrush(Color.FromArgb(200,colVor));
            SolidBrush brushNach = new SolidBrush(Color.FromArgb(200, colNach));


            for (int x = 0, y = flag.Width - 1; x < flag.Height; ++x, --y)
                flag.SetPixel(y, x, Color.Gray);


            Point[] pNach = new Point[3];
            pNach[0] = new Point(0, areaSize);
            pNach[1] = new Point(areaSize, 0);
            pNach[2] = new Point(areaSize, areaSize);
            graf.FillPolygon(brushNach, pNach);

            Point[] pVor = new Point[3];
            pVor[0] = new Point(0, areaSize);
            pVor[1] = new Point(areaSize, 0);
            pVor[2] = new Point(0, 0);
           graf.FillPolygon(brushVor, pVor);
            


           graf.DrawString(Adds.KALENDERKUERZEL[vor] == "--" ? "" : Adds.KALENDERKUERZEL[vor], new Font("Arial", 8), new SolidBrush(Color.Black), 0, 0);
           graf.DrawString(Adds.KALENDERKUERZEL[nach] == "--" ? "" : Adds.KALENDERKUERZEL[nach], new Font("Arial", 8), new SolidBrush(Color.Black), 10, 15);

            context.Response.ContentType = "image/png";
            flag.Save(context.Response.OutputStream, System.Drawing.Imaging.ImageFormat.Png);

Ich denke das wichtigste ist die letzte Zeit in der die Grafik direkt in den Response geschrieben wird.

rgbcolorNach und rgbcolorVor sind integer, welche die Farben enthalten.

Das Ganze funktioniert auf einem Windows 7 Rechner einwandfrei, jedoch unter Windows XP überhaupt nicht.
D.h. die Grafiken werden nicht erzeugt und die Fehlermeldung lautet:

Fehlermeldung:
05.08.2011 09:52:13: Application_Error : Current Request File Path: ~/funktionen/.tmbn Exception: System.Runtime.InteropServices.ExternalException: Allgemeiner Fehler in GDI+.
bei System.Drawing.Image.Save(Stream stream, ImageCodecInfo encoder, EncoderParameters encoderParams)
bei System.Drawing.Image.Save(Stream stream, ImageFormat format)
bei MEINPROJEKT.V5.thumbnails.ProcessRequest(HttpContext context) in E:\source\V5N\MEINPROJEKT.V5\MEINPROJEKT.WEB\thumbnails.cs:Zeile 171.
bei System.Web.HttpApplication.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute()
bei System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously)
05.08.2011 09:52:13: Fehler-URL:
>
|0|52|0|1
Source: System.Drawing
Message: Allgemeiner Fehler in GDI+.
Stack trace: bei System.Drawing.Image.Save(Stream stream, ImageCodecInfo encoder, EncoderParameters encoderParams)
bei System.Drawing.Image.Save(Stream stream, ImageFormat format)
bei MEINPROJEKT.V5.thumbnails.ProcessRequest(HttpContext context) in E:\source\V5N\MEINPROJEKT.V5\MEINPR.WEB\thumbnails.cs:Zeile 171.
bei System.Web.HttpApplication.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute()
bei System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously)
Current Request File Path: ~/funktionen/.tmbn

Woran könnte das liegen, daß es unter Windowx XP (SP3) nicht funktioniert ?
GDI+ ist doch standardmäßig mit intstalliert auf XP...

Danke und Grüße schuppsl

3.170 Beiträge seit 2006
vor 12 Jahren

Hallo,

ich habe da noch was im Hinterkopf, dass das mit PNG nicht direkt funktioniert. Ich glaube, das betrifft den IIS, mit dem in VS integrierten Development-Server müsste es sogar funktionieren.
Wie auch immer, ein Workaround ist es, das PNG in einen MemoryStream zu speichern und dann das Bytearray aus dem MemoryStream in den ResponseStream zu schreiben (unter .NET 4 kannst Du dafür auch Stream.CopyTo verwenden).

Gruß, MarsStein

EDIT: siehe auch ASP.NET Erstellen von PNG Image erzwing Save-Dialog

Non quia difficilia sunt, non audemus, sed quia non audemus, difficilia sunt! - Seneca

S
schuppsl Themenstarter:in
789 Beiträge seit 2007
vor 12 Jahren

Hey Mars.

Vielen Dank an Deinen Hinterkopf!
Habe es nun mit .gif versucht und damit geht es auf Anhieb auf dem XP Rechner.

Vielen Dank, das hätte ich sonst nicht so schnell herausgefunden!

Grüßle