Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
Häufigste Farbe im Rectangle feststellen
Pinselmeister
myCSharp.de - Member



Dabei seit:
Beiträge: 2

Themenstarter:

Häufigste Farbe im Rectangle feststellen

beantworten | zitieren | melden

Guten Abend,

in einem WinForms-Projekt lade ich eine beliebige Grafik in ein Bitmap-Objekt.
In einem bestimmten Bereich (Rectangle) möchte ich jene Farbe ermitteln und zürückgeben, die am häufigsten vorkommt.
Meine Methode gibt willkürliche Farbwerte zurück, die ich nicht erwarte und ich weiß nicht, woran es liegt

private void getCellColor(Bitmap bmp, Rectangle cell, ref Color color)
{
    if (bmp == null)
        return;

    Color[] colors = new Color[cell.Width * cell.Height];  // temporäres Array, so groß wie der Suchbereich
    int counter = 0;  // Array-Index

    for (int y = 0; y < cell.Height; y++)  // alle Farbwerte zeilenweise v.o.n.u durchgehen
    {
        for (int x = 0; x < cell.Width; x++)
        {
            colors[counter] = bmp.GetPixel(x, y);
            counter++;
        }
    }
    var result = colors.GroupBy(c => c).OrderByDescending(c => c.Count()).First();
    color = result.Key;
}

private void button1_Click(object sender, EventArgs e)
{
    if (openFileDialog1.ShowDialog() == System.Windows.Forms.DialogResult.OK)
    {
        using (Bitmap bmp = new Bitmap(openFileDialog1.FileName))
        {
            using (Graphics g = pictureBox1.CreateGraphics())  // temporär für die Vorschau
            {
                g.DrawImage(bmp, new Point(0, 0));

                Color c = new Color();
                Rectangle r = new Rectangle(100, 100, 100, 200);

                getCellColor(bmp, r, ref c);
                this.BackColor = c;
                g.DrawRectangle(Pens.Red, r);
            }
        }
    }
}
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von Pinselmeister am .
private Nachricht | Beiträge des Benutzers
Jompikumpi
myCSharp.de - Member



Dabei seit:
Beiträge: 58

beantworten | zitieren | melden

Du berücksichtigst die Startkoordinate (X,Y) des Rechtecks nicht. Daher startest du immer mit der Koordinate (0,0).
private Nachricht | Beiträge des Benutzers
Pinselmeister
myCSharp.de - Member



Dabei seit:
Beiträge: 2

Themenstarter:

beantworten | zitieren | melden

Danke!
Daran habe ich nicht gedacht.
Mal eben angepasst und es funktioniert

for (int y = cell.Y; y < (cell.Height + cell.Y); y++) 
{
    for (int x = cell.X; x < (cell.Width + cell.X); x++)
    {
private Nachricht | Beiträge des Benutzers
Abt
myCSharp.de - Team

Avatar #avatar-4119.png


Dabei seit:
Beiträge: 15.852

beantworten | zitieren | melden

Schau Dir mal die Grundzüge an, wie man in C# Methoden deklariert.
Es gibt keinen Grund in Deinem Fall den Return über die Parameter bekannt zu geben; eben dafür gibt es die Return-Werte.

private Color GetCellColor(Bitmap bmp, Rectangle cell)
{
   
    return result.Key;
}

[Artikel] C#: Richtlinien für die Namensvergabe
private Nachricht | Beiträge des Benutzers