Bild auf desktop suchen bzw pixel

  • VB.NET

Es gibt 11 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

    Bild auf desktop suchen bzw pixel

    Hallo,

    Ich will eine funktion erstellen womit ich bilder auf den desktop suchen kann also jetzt keine datein sondern jetzt wen z.b im hintergrund bild eine sonne ist,

    und man als das bild angibt soll ein screenshot gemacht werden und da sollen die pixel nach den bild abgesucht werden und die kordinaten von der position wiedergegen wieder.

    Okay ich weiß wie ich ein screenshot mache und den pixel für pixel absuche aber ich weiß nicht wie ich die pixel vom bild mit den screenshot vergleichen soll.

    hoffe einer hat mit verstanden und kann mir helfen ;)

    MFG.

    vbler.
    Nicht ganz trivial, ggf. 2 Nummern zu groß für Dich.
    Definiere, was als Ergebnis des Vergleichs herauskommen soll.
    Ein Pixel-Pixel-Vergleich ist es offenbar nicht.
    ---------------------
    Nimm eines Deiner Source-Bild-Ausschnitte, nimm Dein Soll-Bild und mach eine Kreuzkorrelation. Kalibriert wird das ganze über die Autokorrelation des Soll-Bildes.
    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!
    ich möchte den Bildschirm bzw. den screenshot nach einen bestimmten vorgegebenen bild absuchen.

    ich hatte es so versucht:

    Neues Rectangle im größe vom suchenden Bild, und wenn der Ausschnitt nicht gleich bild ist x + 1 wen x = width ist x = 0 y + 1 und soweiter.
    aber das dauert unglaublich Lange >:

    Ich habe die Suchmaschine angeworfen und die ImageSearchDLL.dll gefunden

    quelle: mit vb.net beispiel:

    elitepvpers.com/forum/coding-t…h-funktion-vb-nutzen.html

    Nur Leider sind im beispiel paar sachen nicht erklärt bzw. der code ist auch Fehlerhaft. Villeicht wird ja einer von euch daraus schlau.

    MFG.

    vbler.
    Sollen wir jetzt für Dich wild fremden C&P-Code analysieren, verstehen und reparieren?
    Was machst Du derweil? :thumbdown:
    Dein Problem, Du stellst Fragen, nicht aber Du verteilst Aufgaben. Das macht mein Chef.
    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!
    Vielleicht nimmst Du Dir den Code her und bereitest ihn soweit auf, dass er
    1. unter Option Strict On compilierbar ist und
    2. Du konkrete Probleme beschreiben kannst.
    Dann kannst Du den Code posten und Deine Probleme konkret benennen.
    Dann wird Dir auch geholfen. :thumbsup:
    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!
    okay das ist der code:


    VB.NET-Quellcode

    1. Option Strict On
    2. Imports AutoItX3Lib



    VB.NET-Quellcode

    1. Module ImageSearcher
    2. <Runtime.InteropServices.DllImport("ImageSearchDLL.dll")> Public Function ImageSearch(ByVal x1 As Integer, ByVal y1 As Integer, ByVal right As Integer, ByVal bottom As Integer, ByVal findImage As String) As String
    3. End Function
    4. Function ImageSearch(ByVal Bild As String, Optional ByVal Mitte As Boolean = True) As Point
    5. Dim a As New AutoItX3
    6. Dim Bild2 = Bild
    7. If Not IO.File.Exists(Bild) Then
    8. MessageBox.Show("Die Datei " & Bild2 & "konnte nicht gefunden werden. Das Programm wird beendet.")
    9. End
    10. End If
    11. If Toleranz > 0 Then Bild = "*" & Toleranz & " " & Bild
    12. Dim x As String = ImageSearch(a.WinGetCaretPosX(), a.WinGetCaretPosY(), a.WinGetCaretPosX() + a.WinGetClientSizeWidth(Fenstername), a.WinGetCaretPosY() + a.WinGetClientSizeHeight(Fenstername), Bild)
    13. If x = "0" Then
    14. MessageBox.Show("Das Bild " & Bild2 & " konnte nicht auf dem Bildschirm gefunden werden. Das Programm wird beendet.")
    15. End
    16. Else
    17. Dim y = x.Split(CChar("|"))
    18. If Mitte = True Then
    19. Return Point.Subtract(New Point(CInt(y(1)), CInt(y(2))), New Size(CInt(CLng(y(3)) \ -2), CInt(CLng(y(4)) \ -2)))
    20. Else
    21. Return New Point(CInt(y(1)), CInt(y(2)))
    22. End If
    23. End If
    24. End Function
    25. End Module


    Jetzt sind 2 sachen nicht deklariert: Einmal Fenstername und Toleranz.
    Toleranz ist ein Wert, z.B. Integer, der 0 oder größer 0 ist.
    Fenstername ist wohl der Name eines Fensters, kann ich nicht genau sagen.

    VB.NET-Quellcode

    1. Dim Toleranz As Integer = 1
    2. Dim Fenstername As String = "Notepad"
    Auf jeden Fall sieht der Code nicht so aus, als könnte er Dein Problem lösen, allerdings kenne ich die Funktionalität der DLL nicht.
    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!
    ja sowas dachte ich mir auch deswegen habe ich den code geändert:

    VB.NET-Quellcode

    1. Module ImageSearcher
    2. Declare Function GetForegroundWindow Lib "user32.dll" Alias "GetForegroundWindow" () _
    3. As Integer
    4. Declare Function GetWindowTextLength Lib "user32.dll" Alias "GetWindowTextLengthA" _
    5. (ByVal hwnd As Integer) As Integer
    6. Declare Function GetWindowText Lib "user32.dll" Alias "GetWindowTextA" (ByVal hwnd _
    7. As Integer, ByVal lpString As String, ByVal cch As Integer) As Integer
    8. Public Function FensterName(ByVal window_hwnd As Integer) As String
    9. Dim l As Integer = GetWindowTextLength(window_hwnd) + 1
    10. If l <= 1 Then
    11. Return "<" & window_hwnd & ">"
    12. Else
    13. Dim buf As String = Space$(l)
    14. l = GetWindowText(window_hwnd, buf, l)
    15. Return buf.Substring(0, l)
    16. End If
    17. End Function
    18. <Runtime.InteropServices.DllImport("ImageSearchDLL.dll")> Public Function ImageSearch(ByVal x1 As Integer, ByVal y1 As Integer, ByVal right As Integer, ByVal bottom As Integer, ByVal findImage As String) As String
    19. End Function
    20. Public Function ImageSearch(ByVal Bild As String, ByVal Toleranz As Double, Optional ByVal Mitte As Boolean = True) As Point
    21. Dim a As New AutoItX3
    22. Dim Bild2 = Bild
    23. If Not IO.File.Exists(Bild) Then
    24. MessageBox.Show("Die Datei " & Bild2 & "konnte nicht gefunden werden. Das Programm wird beendet.")
    25. End
    26. End If
    27. If Toleranz > 0 Then Bild = "*" & Toleranz & " " & Bild
    28. Dim x As String = ImageSearch(a.WinGetCaretPosX(), a.WinGetCaretPosY(), a.WinGetCaretPosX() + a.WinGetClientSizeWidth(FensterName(GetForegroundWindow)), a.WinGetCaretPosY() + a.WinGetClientSizeHeight(FensterName(GetForegroundWindow)), Bild)
    29. If x = "0" Then
    30. MessageBox.Show("Das Bild " & Bild2 & " konnte nicht auf dem Bildschirm gefunden werden. Das Programm wird beendet.")
    31. End
    32. Else
    33. Dim y = x.Split(CChar("|"))
    34. If Mitte = True Then
    35. Return Point.Subtract(New Point(CInt(y(1)), CInt(y(2))), New Size(CInt(CLng(y(3)) \ -2), CInt(CLng(y(4)) \ -2)))
    36. Else
    37. Return New Point(CInt(y(1)), CInt(y(2)))
    38. End If
    39. End If
    40. End Function
    41. End Module


    aber es kommt immer das das bild nicht auf dem bildschirm gefunden wurde -.-
    Probiere es mal mit 2 identischen Bildern, die nur um ein paar Pixel zueinander verschoben sind, weißer Hintergrund mit einem Buchstaben drauf oder so.
    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!