Laden...

Zeichenfolge mit Koordinaten in GraphicsPath umwandeln bzw. in Bitmap zeichnen

Erstellt von CarstenS87 vor 10 Jahren Letzter Beitrag vor 10 Jahren 3.403 Views
C
CarstenS87 Themenstarter:in
12 Beiträge seit 2013
vor 10 Jahren
Zeichenfolge mit Koordinaten in GraphicsPath umwandeln bzw. in Bitmap zeichnen

Hey ihr Lieben,

ich bräuchte mal wieder einen Rat 😕

und zwar habe ich eine Zeichenfolge die einen Pfad darstellt

"M28.93,3.399c2.771,7.002,8.941,10.605,19.121,10.198c0,3.399,0,6.798,0,10.198c-16.07-0.944-12.055,..."

Im XAML-Code kann ich ja einfach nen Path-Objekt erstellen und die Zeichenfolge als Data reinsetzen und alles ist gut.

Jetzt muss/möchte ich aber mit FillPath, den Pfad in eine Bitmap zeichnen und da kommt das Problem.

FillPath erwartet einen GraphicsPath.... kann mir jemand sagen, wie ich die Zeichenfolge "konvertieren" kann oder wie ich die 2 Seiten zusammen bekomme?

Ich bin für jede Hilfe dankbar 😃

Liebe Grüße Carsten

6.911 Beiträge seit 2009
vor 10 Jahren

Hallo CarstenS87,

du kannst ja auch direkt mit WPF ins Bitmap zeichnen.

mfG Gü

Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.

"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"

C
CarstenS87 Themenstarter:in
12 Beiträge seit 2013
vor 10 Jahren

Hallo gfoidl,

das ist richtig, aber auch dafür muss ich die Zeichenfolge in den FillPath (GraphicPath) wandeln.

LG Carsten

16.807 Beiträge seit 2008
vor 10 Jahren

Reicht da nicht einfach ein Geometry.Parse() wie es Beispielhaft in der Doku steht?

C
CarstenS87 Themenstarter:in
12 Beiträge seit 2013
vor 10 Jahren

nein das geht leider nicht, denn die konvertierung von einem media.geometry in drawing2d.graphicpath.pathdata ist nicht möglich 😦

zusätzlich kann der graphicspath.pathdata nichts zugewiesen werden (dient nur zum abrufen)

C
CarstenS87 Themenstarter:in
12 Beiträge seit 2013
vor 10 Jahren

Danke Th69 für den Link. Auf den war ich bei meiner Google Suche auch schon gestoßen, nur scheint der nicht 100% zu funktionieren, so wie ich da bisher durchgestiegen bin.

Ich schaue nebenbei schon nach einer Alternative, die Pfad in Points umzuwandeln 😕

Ursprünglich steht mir das Bild ja in nem PNG zu verfügung, d.h. wenn ich einen anderen Weg finde es exakt zu zeichnen, dann lasse ich auch gerne vom Pfad ab ^^

5.657 Beiträge seit 2006
vor 10 Jahren

Hi CarstenS87,

aber auch dafür muss ich die Zeichenfolge in den FillPath (GraphicPath) wandeln.

Das verstehe ich nicht. Unter WPF braucht es keinen GraphicPath aus dem System.Drawing-Namespace. Unter WPF kannst du den Pfad einfach über eine Bitmap zeichnen (zur Darstellung) oder beides zusammen per RenderTargetBitmap in eine neue Bitmap speichern.

Ich schaue nebenbei schon nach einer Alternative, die Pfad in Points umzuwandeln 😕

Mit der Flatten-Methode kannst du den Pfad in Liniensegmente umwandeln.

Ursprünglich steht mir das Bild ja in nem PNG zu verfügung, d.h. wenn ich einen anderen Weg finde es exakt zu zeichnen, dann lasse ich auch gerne vom Pfad ab ^^

Das verstehe ich nicht, kannst du das nochmal genauer erklären?

Christian

Weeks of programming can save you hours of planning

C
CarstenS87 Themenstarter:in
12 Beiträge seit 2013
vor 10 Jahren

Hey Christian,

in WPF habe ich die Möglichkeit mit dem Pfad-Objekt aus dem Shape-Namespace einen Pfad direkt darzustellen, diesen liefere ich als Points-Array oder als Zeichenfolge. Am ende ergibt dies ein Pfad-Objekt, dass wie ein Rectangle oder eine Ellipse direkt im WPF-Fenster angezeigt wird.

Die Alternative ist den Pfad richtig zu zeichnen (was meines Wissens nur mit dem System.Drawing-Namespace möglich ist).
D.h. ich habe mein Graphics-Objekt, dass ich aus ner Bitmap oder einem anderen möglichen Objekt erstelle (was letztendlich nur dazu dient, dass das gezeichnete irgendwo angezeigt werden kann, bzw. gespeichert wird).
Hier gibt es 2 Methoden: DrawPath (zeichnet nur die Umrandung) und FillPath (zeichnet die Umrandung gefüllt mit einem Texturebrush).

Da ich die Form mit variablen Texturebrush-Objekten füllen möchte muss ich also die FillPath-Methode nehmen.

Und das Problem ist nun, dass die Draw-Methoden für Pfad-Objekte keine Zeichenfolgen annehmen um den Pfad zu definieren sondern nur PointF-Array's.


Mit der Flatten-Methode kannst du leider nur bei einem vorhandenen GraphicPath die Kurven in Linien umwandeln, sprich den Pfad abflachen.


Aber gerne erklär ich das nochmal genauer:

Ich habe eine "Armband.png" mit einem Uhrenarmband - nur das Armband - der Rest der Uhr ist nicht in der Datei abgebildet (dafür existieren weitere *.png).
Nun möchte ich dieses Armband in meinem Programm darstellen und die Farbe verändern können. D.h. ich kann kein Image nehmen das angezeigt wird (oder nur bei Volltonfarben und da dann mit get- und set-pixel arbeiten) und andere Shapes außer Path-Objekten gehen auch nicht (wegen der Form).
Also wandel ich den Inhalt der "Armband.png" mit Adobe Illustrator in einen Pfad um und diese Pfad-Zeichenfolge kann ich mir dann einfach mit nem System.Windows.Shapes.Path-Objekt anzeigen.

Daher habe ich die Zeichenfolge. Wenn ich wüsste ob und wie das geht, kann ich aber auch das Armband aus der png in nen point-array oder sonst was (mögliches) umwandeln, um es im c# code nutzen zu können.

ich hoffe ich habe es etwas deutlicher machen können.

Liebe Grüße und herzlichen Dank

Carsten

5.657 Beiträge seit 2006
vor 10 Jahren

Ich werde einfach nicht schlau daraus. Aber ich verstehe, daß du dir eine PNG-Datei im Illustrator in ein XAML-Pfad umwandeln läßt. Den möchtest du dann zeichnen und mit anderen Elementen (Bitmaps? anderen Pfaden?) verbinden. Dann möchtest du das alles angezeigt haben (oder speichern?).

Das erste Mißverständnis ist meiner Meinung nach, daß du den Pfad unter WPF nicht zeichnen kannst. XAML ist WPF und die Pfade sind dafür da, gezeichnet zu werden. Ich verstehe daher nicht, wie du darauf kommst, daß der Pfad nicht mit WPF (bzw. nur mit GDI+ a.k.a. System.Drawing) gezeichnet werden kann.

GDI kann jedenfalls mit dem Pfad nichts anfangen, da dort kein XAML-Parser vorhanden ist. Deshalb mußt du es konvertieren. Daher der Tip mit der Flatten-Funktion, die Kurven in Liniensegmente auflöst. Das ist übrigens die einzige Möglichkeit, einen Pfad in ein Point-Array umzuwandeln. Ein Point-Array unterstützt eben nur Liniensegmente, und keine Kurven.

Bitte belies dich erstmal, was es mit XAML auf sich hat, und wie es sich von den Funktionen aus System.Drawing unterscheidet. Dann kannst du dich für eine Technologie entscheiden, und es ordentlich umsetzen!

Christian

Weeks of programming can save you hours of planning

C
CarstenS87 Themenstarter:in
12 Beiträge seit 2013
vor 10 Jahren

Sorry, aber entweder ist das ein Missverständnis oder ein rumreiten auf Kleinigkeiten die eigentlich vollkommen unbedeutend sind (daher fühle ich mich leider auch gerade etwas auf den Arm genommen 😦 ).

Was das eigentliche Vorhaben angeht, ja. eine Grafik in WPF darstellen und die Farbe der Grafik mit Texturen und anderen Farben versehen.

Wieso ich darauf komme das der Pfad in XAML nicht gezeichnet wird? Weil es dort keinerlei Zeichen-Methoden gibt, sondern feste Objekte, die bestimmte Formen annehmen können.

In c# hingegen gibt es spezielle Draw-Methoden. Ich hab ja nicht gesagt, dass man das in XAML nicht darstellen kann...

Und was den Pfad angeht, der hat rein gar nichts mit XAML zu tun 😉

daß du dir eine PNG-Datei im Illustrator in ein XAML-Pfad umwandeln läßt

Das ist eins der Hauptelemente aus dem Bereich der skalierbaren Vektorgrafiken...

Und was die Unterschiede zwischen XAML und den System.Drawing funktionen angeht, ich denke die kenne ich mehr als genug.

Liebe Grüße Carsten

P.s.: Sorry falls der Text etwas griffig klingt....