While Pixel auslesen

  • VB.NET

Es gibt 7 Antworten in diesem Thema. Der letzte Beitrag () ist von Niko Ortner.

    While Pixel auslesen

    Hallo,
    Ich habe mal wieder ein Problem...

    Ich möchte Pixel aus meinem Bildschirm auslesen und bei einem Treffer soll etwas Passieren.

    Nun habe ich eine Do While Schleife geschrieben in der Ab Pixel 1,1 auf dem Bildschirm ausgelesen wird...
    Hier der Code:

    Quellcode

    1. Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
    2. Do While Whileziffer > Whileziffer2
    3. Dim b As New Bitmap(1, 1)
    4. Using g As Graphics = Graphics.FromImage(b)
    5. g.CopyFromScreen(X, Y, 0, 0, New Size(1, 1))
    6. End Using
    7. Dim cl As Color = b.GetPixel(0, 0)
    8. If cl.ToString = Prüfsumme Then
    9. MsgBox("gefunden")
    10. End If
    11. X = X + 1
    12. If X = 1680 Then
    13. Y = Y + 1
    14. X = 1
    15. End If
    16. Loop
    17. End Sub


    So aber bei irgentwelchen Zahlen (Immer verschieden) sagt mir mein Compiler bei "g.CopyFromScreen(X, Y, 0, 0, New Size(1, 1))" Ungültiger Parameter...
    Warum?
    Ich Danke im Voraus.
    Was soll das, pixelweise Screenshots zu machen. Das dauert doch eine Kilowoche!

    VB.NET-Quellcode

    1. Function Screenshot() As Bitmap
    2. Dim b As New Bitmap(SystemInformation.VirtualScreen.Width, SystemInformation.VirtualScreen.Height)
    3. Dim g As Graphics = Graphics.FromImage(b)
    4. g.CopyFromScreen(0, 0, 0, 0, b.Size)
    5. g.Dispose()
    6. Return b
    7. End Function

    Hier hast Du eine Screenshot-Prozedur, die den Bildschirm in eine Bitmap packt, mit der Du dann machen kannst, was immer Du willst.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Da hat RodFromGermany total recht: Das Design dieser Sub ist unsinnig.
    Und ich weiß auch warum da der Fehler kommt: Wenn die Bitmap 1680x945 (ich schätze mal 16x9) groß ist liegen die Pixel horizontal von 0 bis 1679 und vertikal von 0 bis 944. Wenn versucht wird vom Bildschirm (der 1680x945 Pixel groß ist) bei 1680 in der Horizontale auszulesen liegt das natürlich außerhalb des gültigen Bereiches.
    Mach es so:

    VB.NET-Quellcode

    1. Sub Button2_Click... 'Gib den Subs bitte aussagekräftige Namen
    2. 'Bitmap mit RodFromGermany's Funktion erzeugen
    3. Dim Bmp As Bitmap = Screenshot
    4. 'Läuft alle Pixel der Bitmap zeilenweise durch
    5. For Y As Integer = 0 To Bmp.Height - 1
    6. For X As Integer = 0 To Bmp.Width - 1
    7. If Bmp.GetPixel(X, Y) = Zielfarbe Then
    8. 'Passiert was
    9. Exit Sub 'Nicht vergessen
    10. End If
    11. 'Oder so, wenn die RGB Werte der Zielfarbe sowiso getrennt vorhanden sind.
    12. With Bmp.GetPixel(X, Y)
    13. If .R = ZielfarbeRot And .G = ZielfarbeGrün And .B = ZielfarbeBlau Then
    14. 'Passiertwas
    15. Exit Sub
    16. End If
    17. End With
    18. Next
    19. Next
    20. End Sub


    Ich vertraue RodFromGermany hier einfach mal. Er wird schon wissen warum er SystemInformation.VirtualScreen zur Begrenzung verwendet.
    "Luckily luh... luckily it wasn't poi-"
    -- Brady in Wonderland, 23. Februar 2015, 1:56
    Desktop Pinner | ApplicationSettings | OnUtils
    Danke :)
    Hat alles super funktioniert.
    Aber kann man auch einen Pixel aus dem Bildschirm ziehen ohne jedes mal ein Screenshot zu machen?
    Wenn ich jetzt in einem Timer der auf 1 steht den Pixel unter meiner Maus in meiner Form anzeigen lassen will beansprucht das doch
    viel Rechenzeit oder?
    Oder angenommen es ist auf meinem Bildschirm ein Kreis der Blinkt und wenn der Kreis einen bestimmten Pixelwert erreicht hat soll meine Maus klicken.
    Der Kreis ist aber z.B. nur für 1 -2 ms auf diesem Pixel. Könnte das VB schaffen?
    Warfley hat da recht. Versuch Dich an der FastGraphicsLib hier im Showroom (vergiss nicht einen Verweis auf den Autor im Programm zu hinterlassen, wenn das gefordert ist)
    "Luckily luh... luckily it wasn't poi-"
    -- Brady in Wonderland, 23. Februar 2015, 1:56
    Desktop Pinner | ApplicationSettings | OnUtils
    Danke :)
    Irgentwie bekomme ich das nicht hin O.o
    Wenn ich diesen Code anwende:

    Quellcode

    1. Imports FastGraphicsLib
    2. Public Class Form1
    3. Dim bla As String
    4. Public Function GetPixel(ByVal x As Integer, ByVal y As Integer) As Color
    5. Dim fg As FastGraphics = FastGraphics.FromScreen(New Rectangle(x, y, 1, 1))
    6. Dim bla2 As Color
    7. bla2 = fg.GetPixel(x, y)
    8. Return (bla2)
    9. End Function
    10. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    11. PictureBox1.BackColor = GetPixel(600, 600)
    12. End Sub
    13. End Class


    und die ganze Zeit auf den Button drücke bekomme ich irgentwelche komischen Farben in meine PictureBox....
    Ich sitze nun seit geschlagenen 4 Stunden an dem Problem und weiß nicht weiter.. :(
    Da hast Du jetzt ein Bisschen was falsch verstanden.
    Beim Klick auf den Button einen Screenshot vom gesamten Bildschirm machen und dann auslesen.

    VB.NET-Quellcode

    1. Dim g As FastGraphicsLib.FastGraphics = FastGraphicsLib.FastGraphics.FromScreen(New Rectangle(0, 0, SystemInformation.VirtualScreen.Width, SystemInformation.VirtualScreen.Height))
    2. PictureBox1.BackColor = g.GetPixel(600, 600)
    3. g.Unlock()

    Das ist der gesamte Code zum Auslesen der Farbe bei 600, 600.
    Falls Du das in einer Schleife habe möchtest musst Du es so machen:

    VB.NET-Quellcode

    1. Dim g As FastGraphicsLib.FastGraphics = FastGraphicsLib.FastGraphics.FromScreen(New Rectangle(0, 0, SystemInformation.VirtualScreen.Width, SystemInformation.VirtualScreen.Height))
    2. For Y As Integer = 0 To SystemInformation.VirtualScreen.Height - 1
    3. For X As Integer = 0 To SystemInformation.VirtualScreen.Width - 1
    4. PictureBox1.BackColor = g.GetPixel(X, Y)
    5. 'Keine gute Idee, aber es geht ums Prinzip
    6. Next
    7. Next
    8. g.Unlock()


    Aber Du möchtest anscheinend wissen wo sich auf dem Bildschirm eine gewisse Farbe befindet.
    Dazu hält die FastGraphicsLib eine Funktion bereit:

    VB.NET-Quellcode

    1. Dim g As FastGraphicsLib.FastGraphics = FastGraphicsLib.FastGraphics.FromScreen(New Rectangle(0, 0, SystemInformation.VirtualScreen.Width, SystemInformation.VirtualScreen.Height))
    2. Dim SB As New System.Text.StringBuilder
    3. For Each i As Point In g.FindPixel(255, 0, 255, 10) '10 bedeutet der Unterschied zwischen den angegebenen Farbwerten und den zu prüfenden Farbwerten darf maximal 10 betragen.
    4. SB.Append("[" & i.X.ToString & ", " & i.Y.ToString & "] ")
    5. Next
    6. TextBox1.Text = SB.ToString


    Allerdings gibt die FastGraphicsLib negative Werte in X Richtung zurück. Das ligt aber mit ziemlicher Sicherheit an der Lib. Kontaktier mal den Autor der Lib. Den würde das sicher interessieren.
    "Luckily luh... luckily it wasn't poi-"
    -- Brady in Wonderland, 23. Februar 2015, 1:56
    Desktop Pinner | ApplicationSettings | OnUtils