Kleines Bild aufm Desktop durch Pixel by Pixel Scanning finden.

  • C#
  • .NET (FX) 4.5–4.8

Es gibt 4 Antworten in diesem Thema. Der letzte Beitrag () ist von VaporiZed.

    Kleines Bild aufm Desktop durch Pixel by Pixel Scanning finden.

    Hallo,

    ich bräuchte vielleicht mal ein Tipp, wie man das ganze umsetzen kann, da ich seit Stunden nicht selber draufkomme.

    Im Prinzip möchte ich ein kleineres Bild auf dem Bildschirm untersuchen. Das heißt, ich mache vom Desktop ein Screenshot(in der Auflösung 1920x1080) und importiere durch die Bitmap Klasse ein Bild(z.B in der Auflösung 1280x720) und lasse dann die x und y Werte des Bildschirms mit der des kleineren Bildes vergleichen durch GetPixel(x,y).
    Ich will damit erreichen, dass wenn das Bild überprüft wurde, dass dann die Maus auf eines der Bildpunkte zeigt(wenn es gut läuft, auf das letzte gefundene Bildpunkt.)

    Mein Code sieht so aus:

    C#-Quellcode

    1. namespace ScanPicture
    2. {
    3. public partial class Form1 : Form
    4. {
    5. int x;
    6. int y;
    7. int l;
    8. int w;
    9. int z;
    10. [DllImport("user32.dll")]
    11. static extern bool SetCursorPos(int X, int Y);
    12. private void btnScan_Click(object sender, EventArgs e)
    13. {
    14. l = 0;
    15. CaptureScreen();
    16. }
    17. private void CaptureScreen()
    18. {
    19. Bitmap myPic; //Bild vom Desktop machen
    20. Bitmap myPic2; //Bild importieren
    21. myPic2 = new Bitmap("Pfad zum Bild");
    22. // Bild vom Bildschirm machen
    23. myPic = new Bitmap(Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height);
    24. Graphics graphics = Graphics.FromImage(myPic as Image);
    25. graphics.CopyFromScreen(0, 0, 0, 0, myPic.Size);
    26. SearchForPicture(myPic2, myPic);
    27. }
    28. private bool SearchForPicture(Bitmap searchFor, Bitmap searchIn)
    29. {
    30. w = 0;
    31. z = 0;
    32. Color FarbeMyPic2 = searchFor.GetPixel(0, 0);
    33. for (x = 0; x < searchIn.Width; x++)
    34. {
    35. for (y = 0; y < searchIn.Height; y++)
    36. {
    37. Color FarbeMyPic = searchIn.GetPixel(x, y);
    38. FarbeMyPic2 = searchFor.GetPixel(w, z);
    39. if (FarbeMyPic == FarbeMyPic2)
    40. {
    41. l++;
    42. if (z + 1 < searchFor.Height)
    43. z++;
    44. if (searchFor.Height == z + 1)
    45. {
    46. if (w < searchFor.Width)
    47. w++;
    48. if (searchFor.Width == w || searchFor.Width < w)
    49. {
    50. MessageBox.Show("Gefunden bei x: " + x + " und " + " y: " + y + "\n" + "So oft hat es gepasst:" + l);
    51. SetCursorPos(x, y);
    52. return true;
    53. }
    54. }
    55. }
    56. }
    57. }
    58. MessageBox.Show("Nicht gefunden!");
    59. return false;
    60. }
    61. }
    62. }



    -> Die Methode funktioniert nur zum Teil. Wenn ich auf den Button drücke, kriege ich ein x und y wert aber das passt nicht so ganz, da die Maus dann ganz oben links in der Ecke des gesuchten Bildes hovert.

    Bzw: Bei kleineren Bildern, funktioniert das. D.h ich erhalte den letzten Bildpunkt von der Methode und meine Maus zieht dann ganz unten rechts zum Pixel

    Was übersehe ich hier?

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Winchester“ ()

    btw: GetPixel ist für einen ganzen Screenshot wahrscheinlich ziemlich langsam und dürfte sich mit LockBits deutlich beschleunigen lassen.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.