Pixel auf dem Bildschirm suchen?

  • VB.NET
  • .NET (FX) 1.0–2.0

Es gibt 7 Antworten in diesem Thema. Der letzte Beitrag () ist von ~blaze~.

    Pixel auf dem Bildschirm suchen?

    Hallo

    Ich möchte gerne einen Pixel (nach RGB) auf meinen Bildschirm suchen und meine Cursor zur der Position dieses Pixels bewegen um einfacher einige Elemente markieren zu können.





    Wie finde ich heraus, wo sich der Pixel auf dem Bildschirm befindet? :)
    "Denken ist die schwerste Arbeit, die es gibt. Das ist wahrscheinlich auch der Grund, warum sich so wenig Leute damit beschäftigen." - Henry Ford
    Hi
    indem du alle Pixel suchst, z.B. per For-Schleife auf einer Bitmap (hier wäre LockBits angebracht). Den Bildschirminhalt kannst du über System.Drawing.Graphics.CopyFromScreen erhalten.

    Nachtrag: Bei LockBits würde ich gleich ein eindimensionales Integer-Array angeben, das 32-Bit RGB-Daten erhält (ohne Alpha), sodass du bequem einfach über For i As Integer = 0 To _bitmap.Width * _bitmap.Height - 1 darüberiterieren kannst. Du kannst natürlich auch Parallel.For dazu verwenden, das wird aber vom Framework 2.0 nicht unterstützt (kannst du natürlich über Threads selber implementieren, Environment.ProcessorCount kann dir auf jeden Fall helfen). Die Bildschirmkoordinaten erhältst du über (x, y) = (i Mod _bitmap.Width, i \ _bitmap.Width). Übrigens erhältst du die Bildschirmabmessungen über die System.Windows.Forms.Screen-Klasse.

    Viele Grüße
    ~blaze~
    Du solltest dein Problem nach diesen Schritten lösen:
    1). Screenshot machen -> Bitmap Objekt erzeugen
    2). For-Schleife: Bitmap hat die Funktion .getPixel (Gibt ein Color Objekt zurück mit Attributen wie red, green, blue)


    Mit Lockbits solltest du dich beschäftigen, falls dir die Geschwindigkeit nicht reicht. Denn auch mit Lockbits wird dein Programm einfrieren während der For-Schleife... Also erstmal alles andere zum Laufen bringen und dann die Auslesegeschwindigkeit aus den Bitmaps verbessern wäre mein Vorschlag...

    getPixel ist zwar langsam, aber du kannst auch sehr gut sehen was sich verbessert hat, wenn du an deinem Algorithmus rumschraubst :)

    ​EDIT: In meiner Lib PixelMagic, die ich früher mal geschrieben habe, ist alles was du machen willst schon drin zum rauskopieren... Sehr primitiv gehalten, leicht verständlich :)
    Ich habe nun einen Screenshot von meinen Desktop, wie es weiter geht verstehe ich allerdings nicht. Könnt ihr mir auf die Sprünge helfen? :)



    VB.NET-Quellcode

    1. Imports System.Drawing
    2. Public Class Form1
    3. Dim Bitmap As New Bitmap(My.Computer.Screen.Bounds.Width, My.Computer.Screen.Bounds.Height)
    4. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    5. Me.Timer1.Start()
    6. End Sub
    7. Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
    8. Dim Bitmap As New Bitmap(My.Computer.Screen.Bounds.Width, My.Computer.Screen.Bounds.Height)
    9. Using Graphics As Graphics = Graphics.FromImage(Bitmap)
    10. Graphics.CopyFromScreen(0, 0, 0, 0, New Size(My.Computer.Screen.Bounds.Width, My.Computer.Screen.Bounds.Height))
    11. End Using
    12. Me.PictureBox1.Image = Bitmap
    13. 'Bitmap.Save("C:\Desktop\Frames\Frame.jpg", Imaging.ImageFormat.Jpeg)
    14. End Sub
    15. End Class
    "Denken ist die schwerste Arbeit, die es gibt. Das ist wahrscheinlich auch der Grund, warum sich so wenig Leute damit beschäftigen." - Henry Ford