Laden...

Beim Zeichnen von Rectangles / Brushes wird Methode nicht unterstützt, Code läuft aber weiter

Erstellt von MrChangeLog vor 7 Jahren Letzter Beitrag vor 7 Jahren 2.193 Views
MrChangeLog Themenstarter:in
121 Beiträge seit 2016
vor 7 Jahren
Beim Zeichnen von Rectangles / Brushes wird Methode nicht unterstützt, Code läuft aber weiter

Ich erstelle in einer WebApplication Zeichnungen (testweise nur Formen; kreise, Rechteke und so).
Dies ist mein Code


Bitmap bmp1 = new Bitmap(500, 500, PixelFormat.Format24bppRgb);
Graphics g1 = Graphics.FromImage(bmp1);
Brush pinsel = new SolidBrush(Color.Blue);
Pen stift = new Pen(pinsel, 10);
Rectangle viereck = new Rectangle();
viereck.Width = 400;
viereck.Height = 400;
viereck.X = 50;
viereck.Y = 50;

g1.DrawEllipse(stift, viereck);

bmp1.Save(Response.OutputStream, ImageFormat.Jpeg);
g1.Dispose();
bmp1.Dispose();
Response.End();

Beim debugging ruft 4. letzte Zeile eine NotSupportedException auf:> Fehlermeldung:

In System.NotSupportedException ist eine Ausnahme vom Typ "System.Web.dll" aufgetreten, die nicht vor einer verwalteten/systemeigenen Grenze behandelt wurde

Zusätzliche Informationen: Die angegebene Methode wird nicht unterstützt.

Wenn ich auf "weiter" klicke läuft der Code aber problemlos weiter.
Kann mir wer erklären, woran es liegt, das die entsprechende Methode nicht unterstützt wird?

2.298 Beiträge seit 2010
vor 7 Jahren

Hallo,

eventuell hilft dir folgendes weiter: C# - Outputting image to response output stream giving GDI+ error

Wissen ist nicht alles. Man muss es auch anwenden können.

PS Fritz!Box API - TR-064 Schnittstelle | PS EventLogManager |

3.170 Beiträge seit 2006
vor 7 Jahren

Hallo,

das Graphics-Objekt solltest Du disposen, bevor Du das Bild in den Stream schreibst.
Vermutlich löst das schon das Problem.
Besser wäre es noch, für Bitmap und Graphics einen using-Block zu verwenden.

Gruß, MarsStein

EDIT: für PNG-Bilder muss man den Umweg über MemoryStream gehen, wie im Link von inflames2k beschrieben.

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

MrChangeLog Themenstarter:in
121 Beiträge seit 2016
vor 7 Jahren

Aaaaalso:

Ich habe den code nun so geändert, das "g.Dispose();" vor "bmp1.save(...)" aufgerufen wird. Ändern tut das aber nichts. Die Exception wird nach wie vor geworfen.

Was den Link von inflames2k betrifft, so weiss ich nicht, wie mir das helfen soll, denn:

  1. Ich rufe keine Bitmap(-Datei) auf, sondern erstelle eine.
  2. ich erstelle ein JPG-Datei und kein PNG

Mit using-Blöcken für Bitmap und Graphics (und entsprechend ohne dispose()-Methoden)


            using (Bitmap bmp1 = new Bitmap(500, 500, PixelFormat.Format24bppRgb))
            {
                using (Graphics g1 = Graphics.FromImage(bmp1))
                {
                    Brush pinsel = new SolidBrush(Color.Blue);
                    Pen stift = new Pen(pinsel, 10);
                    Rectangle viereck = new Rectangle();
                    viereck.Width = 400;
                    viereck.Height = 400;
                    viereck.X = 50;
                    viereck.Y = 50;

                    g1.DrawEllipse(stift, viereck);
                    bmp1.Save(Response.OutputStream, ImageFormat.Jpeg);
                }             
            }
            Response.End();

ändert sich auch nichts. Die Exception wird immer noch geworfen.
(Ist 'bmp1.Save(...)' am richtigen Ort oder sollte ich die Methode ausserhalb von 'using (Graphics ...)' aufrufen? funktionieren tut beides und die Esxception wird auch in beiden Fällen geworfen)

2.298 Beiträge seit 2010
vor 7 Jahren

Hast du denn trotzdem mal den Umweg über den Memory-Stream versucht oder es gleich ganz gelassen?

Aber ich glaube folgendes sollte dir besser weiter helfen:
Common Problems with rendering Bitmaps into ASP.NET OutputStream

Wissen ist nicht alles. Man muss es auch anwenden können.

PS Fritz!Box API - TR-064 Schnittstelle | PS EventLogManager |

MrChangeLog Themenstarter:in
121 Beiträge seit 2016
vor 7 Jahren

Ok, mit MemoryStream funktioniert es ohne Exception (auch mit Jpeg statt Png). Daher Danke @inflames2k

Mich würde dennoch interessieren, was die Ursache der Exception genau war.

2.298 Beiträge seit 2010
vor 7 Jahren

Ok, mit MemoryStream funktioniert es ohne Exception. Daher Danke @inflames2k

Mich würde dennoch interessieren, was die Ursache der Exception genau war.

Ich nehme mal an, dass folgender Satz es grob erklärt:

PNGs (and other formats) need to be saved to a seekable stream.

Entnommen aus dem ersten Link.

Wissen ist nicht alles. Man muss es auch anwenden können.

PS Fritz!Box API - TR-064 Schnittstelle | PS EventLogManager |