Farbabfrage mit Toleranz

  • VB.NET
  • .NET (FX) 4.5–4.8

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

    Farbabfrage mit Toleranz

    Hallo, ich bins mal wieder,

    ich habe eine Frage, und zwar möchte ich wissen wie ich eine If abfrage mit Toleranz machen kann. Sprich das die farbe ein bisschen abweichen kann.

    Diesen Code habe ich bereits:

    VB.NET-Quellcode

    1. ​If pnlDetectedColor.BackColor.ToArgb = pnlSearchColor.BackColor.ToArgb Then
    2. lblSame.Text = "GLEICH"
    3. lblSame.ForeColor = Color.DarkSeaGreen
    4. If autoMiddle = True Then Windows.Forms.Cursor.Position = New Point(My.Computer.Screen.WorkingArea.Width / 2, My.Computer.Screen.WorkingArea.Height / 2)
    5. If autoKlick = True Then Mausklick(Windows.Forms.MouseButtons.Left)
    6. Else
    7. lblSame.Text = "Nicht gleich"
    8. lblSame.ForeColor = Color.Silver
    9. End If


    Danke im Voraus,

    Gruß, Matix
    Grüße, Matix
    Wenn es nur um einen Punkt geht, mach es mit GetPixel*. Damit bekommst Du dann den Farbwert des Pixels. Und dann geht's um Deine Anforderungen. D.h. Du musst selber festlegen, bis wohin Du es als gleich anerkennst. Es gibt dann eben die 4 "Farb"-Kanäle Rot, Grün, Blau und Alpha (Transparenz). Du kannst mit prozentualer oder absoluter Abweichung arbeiten. Wie Du willst.

    *Das ist eine Bitmap-Funktion, d.h. Du musst erstmal von Deinem Bild eine passende Bitmap-Instanz erstellen.
    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.

    VaporiZed schrieb:

    *Das ist eine Bitmap-Funktion, d.h. Du musst erstmal von Deinem Bild eine passende Bitmap-Instanz erstellen.


    Die Farben hat er schon, wie man in der ersten Zeile sieht: If pnlDetectedColor.BackColor.ToArgb = pnlSearchColor.BackColor.ToArgb Then.
    Öhm ... korrekt X/
    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.
    @Matix Media Mach Dir ne separate Boolean-Funktion, der Du 2 Farbwerte übergibst und in der Du die 3 bzw. 4 Kanäle einzeln vergleichst, z.B.

    VB.NET-Quellcode

    1. If Math.Abs(CInt(col1.R) - CInt(col2.R)) > 2 Then Return False

    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!
    @RodFromGermany Danke ich probiers mal! Aber was heißt

    Quellcode

    1. ​Abs
    ?

    Wie ich die Pixel finde weiß ich schon, aber wie kann ich das ganze in dem Schwarzen bereich tolerant machen?

    Danke

    Gruß, Matix
    Grüße, Matix

    Matix Media schrieb:

    Abs
    macht aus einer Zahl den absoluten Betrag.
    aus -5 wird 5.
    Mein Beispiel zeigt, dass sich die einzelnen Kanäle nur um max. 2 unterscheiden sollen.
    Ansonsten müsstest Du in meinem Snippet die Differenz auf den Bereich -2 ... 2 testen.
    Definiere

    Matix Media schrieb:

    dem Schwarzen bereich tolerant machen
    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!
    Also bei einer Farbe im Colorgrabber zum Bespiel gibt es doch meinchmal an der seite so ein Schiebedings (Sorry ich weiß nicht wie das heißt :D) wo man die Hellichkeit einstellen kann.

    Gruß, Matix

    Edit:


    @RodFromGermany Meinst du So?

    VB.NET-Quellcode

    1. Function Toleranz(ByVal col1 As Color, col2 As Color) As Boolean
    2. If Math.Abs(CInt(col1.R) - CInt(col2.R)) > 10 AndAlso Math.Abs(CInt(col1.G) - CInt(col2.G)) > 10 AndAlso Math.Abs(CInt(col1.B) - CInt(col2.B)) > 10 Then Return False Else Return True
    3. End Function
    Grüße, Matix

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

    Matix Media schrieb:

    Meinst du So?
    Nein, andere Logik (OrElse), außerdem würde ich das in 3 Zeilen schreiben:

    VB.NET-Quellcode

    1. Function Toleranz(ByVal col1 As Color, col2 As Color) As Boolean
    2. If Math.Abs(CInt(col1.R) - CInt(col2.R)) > 10 Then Return False
    3. If Math.Abs(CInt(col1.G) - CInt(col2.G)) > 10 Then Return False
    4. If Math.Abs(CInt(col1.B) - CInt(col2.B)) > 10 Then Return False
    5. Return True
    6. End Function
    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!
    @Matix Media Da musst Du Deinen Wert 10 / meinen Wert 2 entsprechend ausprobieren.
    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!