Laden...

Durchschnittsfarbe eines bestimmten Bereichs eines Bildes ermitteln - Polygonauswahl

Erstellt von Proxymaster500 vor 8 Jahren Letzter Beitrag vor 8 Jahren 2.219 Views
P
Proxymaster500 Themenstarter:in
4 Beiträge seit 2015
vor 8 Jahren
Durchschnittsfarbe eines bestimmten Bereichs eines Bildes ermitteln - Polygonauswahl

Hallo,

Ich habe ein kleines Programm geschrieben mit dessen Hilfe man die Durchschnittsfarbe eines bestimmten Bereichs eines Bildes ermitteln kann. Dazu soll es verschiedene Möglichkeiten zur Bereichsauswahl geben.
Eine Rechteck- und Kreisauswahl ist bereits integriert und funktionsfähig, zusätzlich dazu soll allerdings noch eine Polygonauswahl möglich sein.

"Grafisch" wurde diese bereits integriert sodass das Polygon vom User gezeichnet werden kann. Doch ich weiß nicht wie ich diese Auswahl auswerten, also die Farbinformation der einzelnen Pixel herausbekommen kann.

Hier noch das Snippet, welches für das Zeichnen des Polygons verantwortlich ist:


//Mouse Down der PictureBox
if (NewPolygon != null)
                {
                    if (e.Button == MouseButtons.Right)
                    {
                        Finish = true;
                    }
                    else
                    {
                        NewPolygon.Add(e.Location);
                    }
                }
                else
                {
                    NewPolygon = new List<Point>();
                    NewPoint = e.Location;
                    NewPolygon.Add(e.Location);
                }

//MouseMove
 if (NewPolygon == null) return;
                NewPoint = e.Location;
                pbObject.Invalidate();
//Paint Event
 e.Graphics.SmoothingMode = SmoothingMode.AntiAlias;


                    
                    if (NewPolygon != null)
                    {
                        
                        if (NewPolygon.Count > 1)
                        {
                            e.Graphics.DrawLines(darkbluepen, NewPolygon.ToArray());
                        }

                        
                        if (NewPolygon.Count > 0 && Finish != true)
                        {
                            e.Graphics.DrawLine(bluepen, NewPolygon[NewPolygon.Count - 1], NewPoint);
                        }

                        if (Finish == true)
                        {

                            e.Graphics.DrawLine(darkbluepen, NewPolygon[NewPolygon.Count - 1], NewPolygon[0]);
                            e.Graphics.FillPolygon(selectionBrush, NewPolygon.ToArray());
                            NewPolygon.Clear();
                            NewPolygon = null;

                        }
                    }

Hat jemand eine Idee wie ich an Auswahl komme?

Vielen Dank im Voraus 😃

Mit freundlichen Grüßen

J
251 Beiträge seit 2012
vor 8 Jahren
771 Beiträge seit 2009
vor 8 Jahren

Hi,

schau dir mal die GraphicsPath-Klasse an.
Mit Hilfe der IsVisible Methode kannst du dann Punkt für Punkt überprüfen (wenn du das "outer rectangle" durchgehst), ob der Punkt Teil des Polygons ist (ich hoffe, ich habe die Methode richtig verstanden - ansonsten nimm Is a Point inside a Polygon?).

Einen GraphicsPath kannst du mittels Graphics.DrawPath zeichnen.

P
Proxymaster500 Themenstarter:in
4 Beiträge seit 2015
vor 8 Jahren

Danke für die Rückmeldung!

Bitmap habe ich auch für die Auswertung der Rechteckauswahl im Einsatz, werde aber nochmal die Möglichkeiten dieser checken.

MfG

Edit: @Cat Vielen Dank für den Input!

P
Proxymaster500 Themenstarter:in
4 Beiträge seit 2015
vor 8 Jahren

Hab das Ganze jetzt mit kleinen Umwegen über die GraphicsPath-Klasse gelöst. Wobei ich das Inside/Outside-Problem mit einem neumalen des Polygons in Gelb umgangen habe. Hier der Code falls es jemand interessiert:

                    Bitmap orginal = new Bitmap(iObjectImg);
                    Image color = new Bitmap(pbObject.Width, pbObject.Height);
                    Graphics g = Graphics.FromImage(color);
                    g.FillRectangle(polyBrush, 0, 0, pbObject.Width, pbObject.Height);

                    Image blank = new Bitmap(pbObject.Width, pbObject.Height);
                    Graphics gr = Graphics.FromImage(blank);
                    GraphicsPath polyPath = new GraphicsPath();
                    polyPath.AddPolygon(NewPolygon.ToArray());
                    gr.SetClip(polyPath);
                    gr.DrawImage(color, 0, 0);
                    Bitmap polyYellow = new Bitmap(blank);

                    for (int xAuslesen = 1; xAuslesen < pbObject.Width; xAuslesen++)
                    {
                        for (int yAuslesen = 1; yAuslesen < pbObject.Height; yAuslesen++)
                        {

                            if (polyYellow.GetPixel(xAuslesen, yAuslesen) == Color.FromArgb(255, 255, 255, 0))
                            {
                                Color pixelcolor = orginal.GetPixel(xAuslesen, yAuslesen);
                                ColorR += pixelcolor.R;
                                ColorG += pixelcolor.G;
                                ColorB += pixelcolor.B;
                                NumberPixel++;
                            }


                        }
                    }

MfG