GraphicPath folgen Point XY

Topia

Mitglied
Hallo,

ich wollte fragen, ob es möglich wäre z.b einen Graphpath erzeugen mit einer Linie, ellips usw
und an dieser Linie die ja jetzt sich von den anderen unterscheidet etwas bewegen zu lassen z.b eine picturebox wo sich ein Auto Bild drin befindet.

Danke, im vorraus!
 
Hallo Topia,

vor diesem Problem stand ich auch schon einmal. Ich kenne bis heute keine Möglichkeit, die interpolierten Daten für Kurven, Ellipsen etc. aus einem GraphicsPath-Objekt zu extrahieren. Zwar kannst du einige Punkte per PathPoints-Eigenschaft ermitteln, allerdings sind das nur einige Referenzpunkte. Somit kann man den Pfad nicht pixelweise ansprechen.

Die einzige Möglichkeit, die ich sehe, ist die eigene Berechnung der komplexen Formen bzw. eine eigene GraphicsPath-Klasse, die diese Funktionalität implementiert. Alternativ kannst Du den Pfad aus einzelnen kleinen Linien zusammensetzen, was aber unflexibel und mit Sicherheit genauso aufwändig ist wie die erste Lösung.

Gruß
PhoenixLoe
 
GraphicsPath auf ein Image zeichnen und dann über die GetPixel Methode (in einer Schleife von oben nach unten durchlaufen) des Image den Farbwert prüfen.
Wenn Farbe zum Beispiel Schwarz dann Punkt in einer Liste merken.

Zum Schluss kannst du dann die Punkte in der Liste abfahren :D

In wie weit das performant ist kann ich aber nixs zu sagen.
 
Wie realisier ich das den jetzt in C#. Hab erst vor ein paar Wochenn angefangen:
Hier mein Testlauf:

Code:
for (int ij = 1; ij < 5; ij++)
            {
           

                Bitmap neu = (Bitmap)Image.FromFile(@"C:\Users\bsp\Desktop\st58sss52.jpg");

                int width = neu.Width;
                int height = neu.Height;

                Color cor = neu.GetPixel(ij++, ij++);
               string dd = cor.ToString();
                
                int dds = Convert.ToInt32(dd);


                int[] pixel = new int[1000];
                for (int i = 1; i < 5; i++)
                {
                    pixel[i] = dds;



                    int tt = dds;
                    string ii = Convert.ToString(dds);
                    richTextBox1.Text = ii;
                }


                }

                
            }
Ist sicherlich falsch, nur ich habs eben bersucht ^^
Ich krieg irg nicht die Umwandlung hin bzw damit cor als
Code:
pixel[i] = dds;
fungieren kann.
 
Ein Pixel besteht aus 2 Werte X und Y das heißt du brauchst auch 2 Schleifen.
Wie weit deine Schleife laufen soll weißt du aus den Bildangaben (Width und height)

C#:
List<Point> listPoints=new List<Point>();
using(Bitmap bmp= (Bitmap)Image.FromFile(@"C:\Users\bsp\Desktop\st58sss52.jpg"))
{
   for(int x = 0; x < bmp.Width; x++) //laufe von Links nach Rechts
   {
      for(int y = 0; y < bmp.Height; y++) //laufe von oben nach unten
      {
            Color farbe = bmp.GetPixel(x, y);
            if(farbe == Color.Black)
                 listPoints.Add(new Point(x, y));
      }
   }
}

Der using Block besagt übrigens das nach ende des Blockes der Speicher wieder geräumt werden kann für das Bitmap Objekt.
(kannst du in allen Objekten verwenden die die Schnittstelle IDisposable verwenden)

Am besten du testest das mit einem gezeichneten Bild aus Paint
(ev. RGB Werte für Color Objekt selbst setzen Color.SetARGB [oder so], wobei Schwarz müsst ja eigentlich Schwarz sein :rolleyes:).

Wenn das funktioniert kann ich dir zeigen wie man zur Laufzeit ein Bitmap Objekt erstellt und füllen kann mit GraphicPath ;)
Aber nu geh ich erstma ins Bett :D
Oder du schaust dir den Thread an: http://www.tutorials.de/forum/net-g...-picturebox-malen-aehnlich-wie-bei-paint.html
 
Zuletzt bearbeitet von einem Moderator:
Hallo Spyke,

die Idee an sich ist nicht schlecht. Allerdings hast Du dann das Problem, dass die Auflistung nicht sortiert ist. Das Objekt müsste im Moment spaltenweise von oben nach unten springen, je nachdem, wie der Pfad aufgebaut ist :rolleyes:
Da mir kein Algorithmus bekannt ist, eine Liste von Punkten so zu sortieren, dass der ursprüngliche Pfad wieder herauskommt, müsste man sich vielleicht überlegen, wie man ihn anders einlesen kann.
Ich könnte es mir so vorstellen, dass man einen Startpunkt sucht und von dort aus jeden Pixel in einem 9x9-Feld auf einen Nachbar-Pixel überprüft, der noch nicht in der Liste enthalten ist. Das Ganze rekursiv und man sollte doch irgendwie den Pfad erhalten. Da das einen erheblichen Mehr-Aufwand darstellt (im Extremfall die 81-fache Datenmenge (!)), könnte man - falls es funktioniert - evtl. über den Einsatz des BitmapData-Objekts nachdenken, um wenigstens keine Zeit für das Einlesen des Pixel-Farbwerts zu verlieren und die Sache so ein wenig zu beschleunigen.

Wie gesagt, ich habe keine Ahnung, ob es funktioniert. Wenn ich Zeit habe, probiere ich's mal aus. Ansonsten würde ich meine andere Lösung wieder aufgreifen und die Methoden für Linien und Kurven selbst implementieren. Im Internet gibt es zahlreiche Tutorials für die mathematische Berechnung von Bezièr und Konsorten :)

Gruß
PhoenixLoe
 
Du hast ja dann die Liste der Punkte und durchläufst einfach die Liste. Fängst mit dem ersten Punkt an und suchst seinen nächsten Nachbarn.
Das solange weiter mit den nächsten Punkten rekursiv bis die Liste leer ist.
Auf den ersten Blick würde ich sagen könnte sich dafür MergeSort anbieten.
(Klingt eigentlich fast wie deine Idee oder :suspekt: . Es ist spät ich bin Müde :D )
 
Hallo Spyke,

um ehrlich zu sein: das ist tatsächlich genau dieselbe Idee, die ich auch hatte. Aber schön, dass wir einer Meinung sind :)
MergeSort würde sich anbieten, wenn man die Liste unsortiert einliest. Wenn man's allerdings gleich sortiert einliest, kann man sich die nachträgliche Sortierung und damit Rechenzeit sparen. Im Prinzip aber genau das gleiche System.

Ich will jetzt allerdings auch nochmal auf die Person zurückkommen, die den Thread ursprünglich aufgemacht hat :rolleyes:
@Topia: Da Du erst vor ein paar Wochen mit C# angefangen hast, weiß ich nicht, wieviel Du von dem verstanden hast, was in den letzten zwei Antworten besprochen wurde. Vielleicht sagst Du mal, ob Du noch einmal zusätzliche Erläuterungen benötigst oder ob Du Dich erst einmal selbst an dem Problem versuchen willst.

Gruß
PhoenixLoe
 

Neue Beiträge

Zurück