[..] Prendre toutes les teintes d'une couleur

Aide et conseils concernant AutoIt et ses outils.
Règles du forum
.
Répondre
Utilisateur 3643 supprimé
Status : Hors ligne

[..] Prendre toutes les teintes d'une couleur

#1

Message par Utilisateur 3643 supprimé »

Re-bonjour
je voulais savoir comment faire pour que mon programme réagisse à toute les formes de rouges

Code : Tout sélectionner

Local $mousePos
while 1
    $mousePos=MouseGetPos()
    Switch PixelGetColor($mousePos[0],$mousePos[1])
        Case 0xFF0000
            SplashTextOn("","bonjour")
            SplashOff()
    EndSwitch
wend
Je voudrait que mon script réagisse à toutes (ou presque) les teintes de rouge mais sans avoir à TOUTE les marquées

c'est Possible ?

merci d'avance
Avatar du membre
Strofe
Niveau 5
Niveau 5
Messages : 182
Enregistré le : ven. 26 sept. 2008 23:16
Localisation : Picardie, Oise, Beauvais
Status : Hors ligne

Re: [..] prendre toute les teintes d'une couleur

#2

Message par Strofe »

Bonsoir

http://www.ecse.rpi.edu/~schubert/Light ... (Gage).jpg

La couleur Rouge :

; Longueur d'onde = ~ 625-740
; Fréquence = 480-405
; Longueur d'onde dans le vide (nm) = ~ 625-740
; Fréquence (THz) = 480-405
; Énergie de photon (eV) = ~ 1.6 - 2.0

Une bonne piste..

Reste à
1°) Définir la zone de couleur Rouge
2°) Convertir le RVB et le vérifier avec la zone.

A voir Rec.709

Bon courage :wink:
Y a pas de problème, y a que des solutions. Reste à les trouver.
Avatar du membre
mikell
Spammer !
Spammer !
Messages : 6292
Enregistré le : dim. 29 mai 2011 17:32
Localisation : Deep Cévennes
Status : Hors ligne

Re: [..] prendre toute les teintes d'une couleur

#3

Message par mikell »

Pas clair ça, va déjà falloir commencer par définir ce que tu entends par "toutes (ou presque) les teintes de rouge"
FF c'est le maximum pour une couleur, mais FF0000 = rouge et FFFF00 = jaune citron
Pas facile ton histoire :wink:

Bon je blague, essaie ça

Code : Tout sélectionner

while 1
    $mousePos=MouseGetPos()
    $x = $mousePos[0]
    $y = $mousePos[1]
    PixelSearch($x, $y, $x+1, $y+1, 0xFF0000, [b]50[/b])  [color=#008000]; <= là tu dois tester différentes valeurs[/color]
    If Not @error Then ExitLoop
wend
Msgbox(0,"", "j'en ai trouvé un")
" L'échec est le fondement de la réussite. " (Lao-Tseu )
" Plus ça rate, plus on a de chances que ça marche " (les Shadoks )
Avatar du membre
zeshrek
Niveau 10
Niveau 10
Messages : 984
Enregistré le : mer. 17 nov. 2010 09:31
Localisation : Sur ma chaise
Status : Hors ligne

Re: [..] prendre toute les teintes d'une couleur

#4

Message par zeshrek »

Je ne sais pas si c'est toujours d'actualité comme question, mais je propose ceci :

Code : Tout sélectionner

While 1
    $mousePos = MouseGetPos()
    $x = $mousePos[0]
    $y = $mousePos[1]
    $col = StringRight("000000" & Hex(PixelGetColor($x, $y)), 6)
    $rouge = Dec(StringMid($col, 1, 2))
    $vert = Dec(StringMid($col, 3, 2))
    $bleu = Dec(StringMid($col, 5, 2))
    If BitAND($rouge > $vert, $rouge > $bleu) Then
        MsgBox(0, "", "pixel rouge trouvé")
        ExitLoop
    EndIf
WEnd
Tout ce passe dans le bitand
La definition que j'ai pris pour rouge est que la composante rouge doit etre strictement supperieure chacune des deux autres couleurs.

Tu peux bien entendu modifier et/ou enrichir les criteres qui définissent qu'une couleur est 'rouge'
Si vis pacem para bellum
Avatar du membre
mikell
Spammer !
Spammer !
Messages : 6292
Enregistré le : dim. 29 mai 2011 17:32
Localisation : Deep Cévennes
Status : Hors ligne

Re: [..] prendre toute les teintes d'une couleur

#5

Message par mikell »

Heureusement qu'on peut modifier les critères, ake sinon FFFE00 serait rouge.... Image
" L'échec est le fondement de la réussite. " (Lao-Tseu )
" Plus ça rate, plus on a de chances que ça marche " (les Shadoks )
Avatar du membre
zeshrek
Niveau 10
Niveau 10
Messages : 984
Enregistré le : mer. 17 nov. 2010 09:31
Localisation : Sur ma chaise
Status : Hors ligne

Re: [..] prendre toute les teintes d'une couleur

#6

Message par zeshrek »

Pfff... c'était juste un indice pour le mettre sur la voie
Du coup je me suis fait la conversion pour retrouver le 'hue' (N° de teinte) correspondant au RVB du pixel sur la roue chromatique

Code : Tout sélectionner

#include <Array.au3>

While 1
    $mousePos = MouseGetPos()
    $x = $mousePos[0]
    $y = $mousePos[1]
    $col = StringRight("000000" & Hex(PixelGetColor($x, $y)), 6)
    $rouge = Dec(StringMid($col, 1, 2))
    $vert = Dec(StringMid($col, 3, 2))
    $bleu = Dec(StringMid($col, 5, 2))
    Local $RVB[3] = [$rouge, $vert, $bleu]
    If BitAND($rouge > $vert, $rouge > $bleu) Then
        _ArraySort($RVB, 1)
        $Hue = Mod(60 * ($vert - $bleu) / ($RVB[0] - $RVB[2]) + 360, 360) ; formule de conversion RVB vers le H de HSV du cercle chromatique (pour afiner la detection des rouges, et éviter les pixels trop noirs, gris ou trop blancs, ol faut aussi mettre les formules pour trouver le S (saturation) et le V (Value).
        If $Hue < 40 Or $Hue > 320 Then ; J'ai arbitraierment défini le rouge comme les valeurs comprises entre -40 (320) et +40 degrés sur le cercle chromatique
            MsgBox(0, "", "pixel rouge trouvé"&@crlf&"Couleur RVB = "&$col&@crlf&"Teinte (Hue) = "&$Hue)
            ExitLoop
        EndIf
    EndIf
WEnd
Je n'ai pas pris en compte la saturation (qui va de la couleur au blanc) ni la valeur (qui va du noir a la couleur), mais il est possible d'ajouter les formules pour éviter les couleurs titant trop vers le gris, le blanc ou le noir
Si vis pacem para bellum
Avatar du membre
mikell
Spammer !
Spammer !
Messages : 6292
Enregistré le : dim. 29 mai 2011 17:32
Localisation : Deep Cévennes
Status : Hors ligne

Re: [..] prendre toute les teintes d'une couleur

#7

Message par mikell »

Eh ben voilà... celui-là, je le mets de côté, merci :mrgreen:

BTW j'aimerais bien savoir comment fonctionne le test de "shade variation" dans la fonction PixelSearch, impossible de trouver ça :?
" L'échec est le fondement de la réussite. " (Lao-Tseu )
" Plus ça rate, plus on a de chances que ça marche " (les Shadoks )
Avatar du membre
zeshrek
Niveau 10
Niveau 10
Messages : 984
Enregistré le : mer. 17 nov. 2010 09:31
Localisation : Sur ma chaise
Status : Hors ligne

Re: [..] Prendre toutes les teintes d'une couleur

#8

Message par zeshrek »

Pour ton histoire de shade variation, tu dois pouvoir gerer ca par toi même en exploitant les formules de Saturation et/ou de Value

Code : Tout sélectionner

#include <Array.au3>

While 1
    $mousePos = MouseGetPos()
    $x = $mousePos[0]
    $y = $mousePos[1]
    $col = StringRight("000000" & Hex(PixelGetColor($x, $y)), 6)
    $rouge = Dec(StringMid($col, 1, 2))
    $vert = Dec(StringMid($col, 3, 2))
    $bleu = Dec(StringMid($col, 5, 2))
    Local $RVB[3] = [$rouge, $vert, $bleu]
    If BitAND($rouge > $vert, $rouge > $bleu) Then
        _ArraySort($RVB, 1)
        $Hue = Mod(60 * ($vert - $bleu) / ($RVB[0] - $RVB[2]) + 360, 360) ; formule de conversion RVB vers HSV du cercle chromatique
        If $RVB[0] = 0 Then
            $Saturation = 0
        Else
            $Saturation = 1 - $RVB[2] / $RVB[0]
        EndIf
        $Value = $RVB[0]
        If BitAND(BitOR($Hue < 40, $Hue > 320), $Saturation > 0.2, $Value > .2) Then
            ; J'ai arbitraierment défini le rouge comme les valeurs comprises entre -40 (320) et +40 degrés sur le cercle chromatique (donc 360 degrés)
            ; Coté saturation elles doivent etre >0.2 (pour une saturation possible entre 0 et 1) pour éviter les teintes trop délavées (0 étant la désaturation totale et 1 étant la saturation totale, donc la couleur 'naturelle')
            ; et la value (qu'on pourrait appeler la luminosité)  pot etre >0.2 (pour une saturation possible entre 0 et 1) pour éviter les teintes trop sombres (0 étant l'absence de luminosité et 1 la couleur non a sa luminosité 'naturelle')
            MsgBox(0, "", "pixel rouge trouvé" & @CRLF & "Couleur RVB = " & $col & @CRLF & "Teinte (Hue) = " & $Hue)
            ExitLoop
        EndIf
    EndIf
WEnd
Bon, j'arrete avec la colorimétrie pour ce WE ;)

Shade
Si vis pacem para bellum
Répondre