[C#] Button in Screenshot suchen


Ronox

Mitglied
Hi,
ich stehe grade vor einem kleinen Problem und denke das ich es Falsch angehe.
Also ich habe einen ScreenShot von einem Programm, und will nun die X / Y Koordinate von einem Button bekommen, von diesem Button habe ich ein Bild welches ich erstmal in eine PictureBox geladen habe.

Hier der Quellcode:
Code:
            Bitmap tmp = new Bitmap("C:\\FindButton.bmp");
            Bitmap button1 = (Bitmap)pictureBox1.Image;
            int b1Treffer = 0;
            for (int x = 0; x < tmp.Width; x++)
            {
                for (int y = 0; y < tmp.Height; y++)
                {
                    if (tmp.GetPixel(x, y) == button1.GetPixel(0, 0))
                    {
                        for (int x2 = 0; x2 < button1.Width; x2++)
                        {
                            for (int y2 = 0; y2 < button1.Height; y2++)
                            {
                                if (tmp.GetPixel((x + x2), (y + y2)) == button1.GetPixel(x2, y2))
                                {
                                    b1Treffer++;
                                }
                                else
                                {
                                    b1Treffer = 0;
                                }
                            }
                        }
                    }
                }
            }
            MessageBox.Show("Pixel - Treffer für Button1: " + b1Treffer);
        }
Ich dachte mir jetzt, das er den Screenshot Pixel für Pixel vergleicht, wenn er einen Pixel findet der mit dem Button zusammenpasst, wird ab diesem Pixel geprüft ob dieser mit dem Button zusammen passt. Aber leider funktioniert das nicht und ist leider auch sehr unperformant. Gibt es vielleicht eine Einfachere Methode?
 

Shakie

Erfahrenes Mitglied
In dem von dir gezeigten Code lädst du das Bitmap aber nicht in die Picturebox, sondern vergleichst deinen Screenshot mit dem Bild, das in der PictureBox drin ist (vermutlich ein leeres Bild).
Ersetze mal
C#:
Bitmap tmp = new Bitmap("C:\\FindButton.bmp");
Bitmap button1 = (Bitmap)pictureBox1.Image;
durch
C#:
Bitmap button1 = new Bitmap("C:\\FindButton.bmp");
 

Ronox

Mitglied
Nein das ist so schon richtig.
Also ich habe einen Screenshot(Abgelegt C:\\FindButton.bmp) und ein Screenshot vom Button (in pictureBox1) und möchte jetzt den Button in dem Screenshot finden und mir dann halt die Koordinate geben lassen wo dieser Button zu finden ist.
Nur leider habe ich einen Fehler in meiner Logik, und das ganze ist nicht sehr performant, daher die Frage ob es eine Möglichkeit gibt das ganze anders umzusetzen?
 
V

VScan

Hallo,

hat dein Bild die gleichen Farbwerte an der Stelle des Buttons wie der Button selbst?

Wenn ja, warum deckst Du nicht einen Bereich ab, an dem Du die Farbwerte exakt abspeicherst (linke obere ecke des Buttons) und diese dann im zu dursuchenden Bild vergleichst... d.h. wenn an einer Stelle RGB(*,*,*) zu finden ist und die umliegenden Werte, je nach größe des Bereichs den Du gewählt hast auch passen, dann beginne mit dem Bildvergleich an ermittelter Stelle.

Wegen der Performanz: solange du Pixel für Pixel checken musst, wird das nicht schneller denke ich, aber eine andere Möglichkeit weis ich leider auch nicht.


MFG