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
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
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