#include #include #include #include _couleur_exemple() Func _couleur_exemple() ; $couleur_choisie = 0xff9900 $couleur_opposee = 0xffffff - $couleur_choisie $couleur_luminosite = 0xffffff $couleur_luminosite_opposee = 0xffffff - $couleur_luminosite $couleur_saturee = 0xff9900 $couleur_saturee_opposee = 0xffffff - $couleur_saturee $GUI = GUICreate("la boîte à couleurs", 400, 500) $iMemo = GUICtrlCreateEdit("", 2, 220, 396, 250, BitOR($WS_VSCROLL, $WS_HSCROLL)) GUISetFont(9, 400, 0, "Courier New") ;---------------------------------------------------------------------------------------------------------------------------------------------------------- $Bouton_couleur_choisie = GUICtrlCreateButton("choisir", 20, 10, 170, 30) ; orange clair GUICtrlSetBkColor($Bouton_couleur_choisie,$couleur_choisie) GUICtrlCreateLabel("votre couleur", 20, 42, 170, 14) $libelle_couleur_choisie = GUICtrlCreateLabel("", 20, 56, 170, 14) ; $Bouton_couleur_opposee = GUICtrlCreateLabel("", 210, 10, 170, 30) ; bleu-ciel clair GUICtrlSetBkColor($Bouton_couleur_opposee,$couleur_opposee) GUICtrlCreateLabel("couleur opposée", 210, 42, 170, 14) $libelle_couleur_opposee = GUICtrlCreateLabel("", 210, 56, 170, 14) ;---------------------------------------------------------------------------------------------------------------------------------------------------------- $Button_couleur_luminosite = GUICtrlCreateLabel("", 20, 80, 170, 30) ; orange sombre GUICtrlSetBkColor($Button_couleur_luminosite,$couleur_luminosite) GUICtrlCreateLabel("luminosité inversée", 20, 112, 170, 14) $libelle_couleur_luminosite = GUICtrlCreateLabel("", 20, 126, 170, 14) ; $Button_couleur_luminosite_opposee = GUICtrlCreateLabel("", 210, 80, 170, 30) ; bleu sombre GUICtrlSetBkColor($Button_couleur_luminosite_opposee,$couleur_luminosite_opposee) GUICtrlCreateLabel("luminosité inversée", 210, 112, 170, 14) $libelle_couleur_luminosite_opposee = GUICtrlCreateLabel("", 210, 126, 170, 14) ;---------------------------------------------------------------------------------------------------------------------------------------------------------- $Bouton_couleur_saturee = GUICtrlCreateLabel("", 20, 150, 170, 30) ; orange saturé GUICtrlSetBkColor($Bouton_couleur_saturee,$couleur_saturee) GUICtrlCreateLabel("saturée", 20, 182, 170, 14) $libelle_couleur_saturee = GUICtrlCreateLabel("", 20, 196, 170, 14) ; $Button_couleur_saturee_opposee = GUICtrlCreateLabel("", 210, 150, 170, 30) ; bleu-ciel saturé GUICtrlSetBkColor($Button_couleur_saturee_opposee,$couleur_saturee_opposee) GUICtrlCreateLabel("saturée inversée", 210, 182, 170, 14) $libelle_couleur_saturee_opposee = GUICtrlCreateLabel("", 210, 196, 170, 14) ;---------------------------------------------------------------------------------------------------------------------------------------------------------- GUISetState() ; While 1 Switch GUIGetMsg() Case $GUI_EVENT_CLOSE ExitLoop Case $Bouton_couleur_choisie ; $couleur_choisie = _ChooseColorRGB(0xff9900, $GUI) ; $couleur_HSL = RGB_HSL ($couleur_choisie) ; "H=hhh,S=sss,L=lll" GUICtrlSetData($iMemo, @CRLF & " choisie ........................." & @CRLF, 1) GUICtrlSetData($iMemo, " "& $couleur_choisie &" "& $couleur_HSL & @CRLF, 1) $debutH = StringInStr($couleur_HSL, "H=")+2 ; HSL from 0 to 240 $debutS = StringInStr($couleur_HSL, ",S=")+3 $debutL = StringInStr($couleur_HSL, ",L")+3 $length_HSL = StringLen($couleur_HSL) $H_choisie = Int(StringMid($couleur_HSL, $debutH, $debutS-$debutH-3)) $S_choisie = Int(StringMid($couleur_HSL, $debutS, $debutL-$debutS-3)) $L_choisie = Int(StringMid($couleur_HSL, $debutL, $length_HSL-$debutL+1)) ;$couleur_opposee = 0xffffff - $couleur_choisie $couleur_opposee = "0x"&Hex(0xffffff - $couleur_choisie,6) $couleur_opposee_HSL = RGB_HSL ($couleur_opposee) GUICtrlSetData($iMemo, " opposée ........................." & @CRLF, 1) GUICtrlSetData($iMemo, " "& $couleur_opposee &" "& $couleur_opposee_HSL & @CRLF, 1) $debutH = StringInStr($couleur_opposee_HSL, "H=")+2 ; HSL from 0 to 240 $debutS = StringInStr($couleur_opposee_HSL, ",S=")+3 $debutL = StringInStr($couleur_opposee_HSL, ",L")+3 $length_HSL = StringLen($couleur_opposee_HSL) $H_opposee = Int(StringMid($couleur_opposee_HSL, $debutH, $debutS-$debutH-3)) $S_opposee = Int(StringMid($couleur_opposee_HSL, $debutS, $debutL-$debutS-3)) $L_opposee = Int(StringMid($couleur_opposee_HSL, $debutL, $length_HSL-$debutL+1)) ;-------------------------------------------------------------------------------------------------------------------------------- $couleur_luminosite_HSL = "H="&$H_choisie & ",S="&$S_choisie & ",L=240" ; "H=hhh,S=sss,L=240" $couleur_luminosite = HSL_RGB($couleur_luminosite_HSL) GUICtrlSetData($iMemo, " luminosite ........................." & @CRLF, 1) GUICtrlSetData($iMemo, " "& $couleur_luminosite &" "& $couleur_luminosite_HSL & @CRLF, 1) $couleur_luminosite_opposee_HSL = "H="&$H_opposee & ",S="&$S_opposee & ",L=240" ; "H=hhh,S=sss,L=240" $couleur_luminosite_opposee = HSL_RGB($couleur_luminosite_opposee_HSL) GUICtrlSetData($iMemo, " luminosite opposée ........................." & @CRLF, 1) GUICtrlSetData($iMemo, " "& $couleur_luminosite_opposee &" "& $couleur_luminosite_opposee_HSL & @CRLF, 1) ;-------------------------------------------------------------------------------------------------------------------------------- $couleur_saturee_HSL = "H="&$H_choisie&",S=240"&",L="&$L_choisie ; "H=hhh,S=240,L=lll" $couleur_saturee = HSL_RGB($couleur_saturee_HSL) GUICtrlSetData($iMemo, " saturée ........................." & @CRLF, 1) GUICtrlSetData($iMemo, " "& $couleur_saturee &" "& $couleur_saturee_HSL & @CRLF, 1) $couleur_saturee_opposee_HSL = "H="&$H_opposee & ",S=240" & ",L="&$L_opposee ; "H=hhh,S=240,L=lll" $couleur_saturee_opposee = HSL_RGB($couleur_saturee_opposee_HSL) GUICtrlSetData($iMemo, " saturée opposée ........................." & @CRLF, 1) GUICtrlSetData($iMemo, " "& $couleur_saturee_opposee &" "& $couleur_saturee_opposee_HSL & @CRLF, 1) ;-------------------------------------------------------------------------------------------------------------------------------- GUICtrlSetBkColor($Bouton_couleur_choisie,$couleur_choisie) GUICtrlSetData($libelle_couleur_choisie, Hex($couleur_choisie,6) & " " & RGB_HSL ($couleur_choisie)) ; GUICtrlSetBkColor($Bouton_couleur_opposee,$couleur_opposee) GUICtrlSetData($libelle_couleur_opposee, Hex($couleur_opposee,6) & " " & RGB_HSL ($couleur_opposee)) ;-------------------------------------------------------------------------------------------------------------------------------- GUICtrlSetBkColor($Button_couleur_luminosite,$couleur_luminosite) GUICtrlSetData($libelle_couleur_luminosite, Hex($couleur_luminosite,6) & " " & RGB_HSL ($couleur_luminosite)) ; GUICtrlSetBkColor($Button_couleur_luminosite_opposee,$couleur_luminosite_opposee) GUICtrlSetData($libelle_couleur_luminosite_opposee, Hex($couleur_luminosite_opposee,6) & " " & RGB_HSL ($couleur_luminosite_opposee)) ;-------------------------------------------------------------------------------------------------------------------------------- GUICtrlSetBkColor($Bouton_couleur_saturee,$couleur_saturee) GUICtrlSetData($libelle_couleur_saturee, Hex($couleur_saturee,6) & " " & RGB_HSL($couleur_saturee)) ; GUICtrlSetBkColor($Button_couleur_saturee_opposee,$couleur_saturee_opposee) GUICtrlSetData($libelle_couleur_saturee_opposee, Hex($couleur_saturee_opposee,6) & " " & RGB_HSL($couleur_saturee_opposee)) ;-------------------------------------------------------------------------------------------------------------------------------- EndSwitch WEnd ; EndFunc ;-------------------------------------------------------------------------------------------------------------------------------- ; Func _ChooseColorRGB($iColorRef = 0, $hWndOwnder = 0) ; Local $tcc, $tChoose, $color_picked, $iResult ; $tChoose = DllStructCreate($tagCHOOSECOLOR) $tcc = DllStructCreate("int[16]") $iColorRef = Hex(String($iColorRef), 6) $iColorRef = '0x' & StringMid($iColorRef, 5, 2) & StringMid($iColorRef, 3, 2) & StringMid($iColorRef, 1, 2) DllStructSetData($tChoose, "Size", DllStructGetSize($tChoose)) DllStructSetData($tChoose, "hWndOwnder", $hWndOwnder) DllStructSetData($tChoose, "rgbResult", $iColorRef) DllStructSetData($tChoose, "CustColors", DllStructGetPtr($tcc)) DllStructSetData($tChoose, "Flags", BitOR($__MISCCONSTANT_CC_ANYCOLOR, $__MISCCONSTANT_CC_FULLOPEN, $__MISCCONSTANT_CC_RGBINIT)) $iResult = DllCall("comdlg32.dll", "long", "ChooseColor", "ptr", DllStructGetPtr($tChoose)) $color_picked = Hex(String(DllStructGetData($tChoose, "rgbResult")), 6) Return '0x' & StringMid($color_picked, 5, 2) & StringMid($color_picked, 3, 2) & StringMid($color_picked, 1, 2) ; EndFunc ; Func HSL_RGB($couleur_HSL) ; Local $_teinte ;Teinte de la couleur Local $_saturation ;Saturation de la couleur Local $_luminosite ;Luminosité de la couleur Local $MaxRvb = Int(255) ;Maximum d'une couleur RVB Local $MaxComposanteRvb = Int(255) ;Maximum d'une composante RVB Local $MaxComposanteRvbFois2 = Int($MaxComposanteRvb * 2) ;Maximum d'une composante RVB multiplié par 2 Local $MaxTsl = Int(240) ;Maximum d'une composante TSL Local $MaxTslSur2 = Int($MaxTsl / 2) ;Maximum d'une composante TSL divisé par 2 Local $MaxTslSur3 = Int($MaxTsl / 3) ;Maximum d'une composante TSL divisé par 3 Local $MaxTslFois2 = Int($MaxTsl * 2) ;Maximum d'une composante TSL multiplié par 3 Local $MaxTsl2Sur3 = Int($MaxTsl * 2 / 3) ;Maximum d'une composante TSL multiplié par 2 / 3 $startH = StringInStr($couleur_HSL, "H=")+2 ; HSL from 0 to 240 $startS = StringInStr($couleur_HSL, ",S=")+3 $startL = StringInStr($couleur_HSL, ",L")+3 $t = Int(StringMid($couleur_HSL, $startH, $startS-$startH-3)) $s = Int(StringMid($couleur_HSL, $startS, $startL-$startS-3)) $lum = Int(StringMid($couleur_HSL, $startL, StringLen($couleur_HSL)-$startL+1)) Dim $r = 0 Dim $v = 0 Dim $b = 0 If $lum <> 0 Then Dim $temp ;1 - Si la saturation = 0 alors normaliser la luminosité par rapport au MaxRvb ;et affecter cette normalisation aux compostantes R, V et B. If $s = 0 Then $temp = ($lum * $MaxRvb) / $MaxTsl $r = $temp $v = $temp $b = $temp Else Dim $temp2 ;2 - Test de la luminosité If $lum <= $MaxTslSur2 Then ;Si la L < 0.5, temp = L * (1.0 + S) $temp = (($lum * ($MaxTsl + $s)) + $MaxTslSur2) / $MaxTsl Else ;Sinon la L >= 0.5, temp = (L+S) - (L*S) $temp = ($lum + $s) - ((($lum * $s) + 120) / 240) EndIf ;3 - Calcul de temp2 = 2.0 * L - temp $temp2 = (2 * $lum) - $temp ;4 - Pas de normalisation entre 0 et 1... ;5.1 - Calculer pour chaque RGB : ;R : TeinteR = T + 1/3 ;V : TeinteV = T ;B : TeinteB = T - 1/3 ;Le reste du calcul se fait dans la fonction TeinteVersRVB, ;afin de factoriser le calcul pour chaques composantes $r = TeinteVersRvb($temp, $temp2, $t + $MaxTslSur3) $v = TeinteVersRvb($temp, $temp2, $t) $b = TeinteVersRvb($temp, $temp2, $t - $MaxTslSur3) EndIf EndIf $result = "0x"&Hex($r,2)&Hex($v,2)&Hex($b,2) return ( $result ) ; EndFunc ; Func TeinteVersRvb($temp1, $temp2, $teinte) ; Local $MaxRvb = Int(255) ;Maximum d'une couleur RVB Local $MaxTsl = Int(240) ;Maximum d'une composante TSL Local $MaxTslSur2 = Int($MaxTsl / 2) ;Maximum d'une composante TSL divisé par 2 Local $MaxTsl2Sur3 = Int($MaxTsl * 2 / 3) ;Maximum d'une composante TSL multiplié par 2 / 3 ; Dim $c $temp1 = Int($temp1) $temp2 = Int($temp2) $teinte = Int($teinte) ;5.2 - Si T < 0 alors T = T + 1.0 If ($teinte < 0) And (($teinte + $MaxTsl) >= $teinte) Then $teinte += $MaxTsl EndIf ;5.2 - Si T > 1 alors T = T - 1.0 If ($teinte > $MaxTsl) And (($teinte - $MaxTsl) <= $teinte) Then $teinte -= $MaxTsl EndIf ;6 - Si 6.0 * T < 1 alors C = temp2 + (temp1 - temp2) * 6.0 * teinte If (6 * $teinte) < $MaxTsl Then $c = Int($temp2 + (Int(((($temp1 - $temp2) * $teinte) + 20) / 40))) ElseIf (2 * $teinte) < $MaxTsl Then $c = Int($temp1) ElseIf (3 * $teinte) < 480 Then $c = Int($temp2 + (Int(((($temp1 - $temp2) * ($MaxTsl2Sur3 - $teinte)) + 20) / 40))) Else $c = Int($temp2) EndIf ;7 - Normaliser c sur MaxRvb Return (Floor((($c * $MaxRvb) + 120) / $MaxTsl)) EndFunc Func RGB_HSL($couleur_RGB) ; $rouge = Int('0x' & StringMid($couleur_RGB, 3, 2)) ;RGB from 0 to 255 $vert = Int('0x' & StringMid($couleur_RGB, 5, 2)) $bleu = Int('0x' & StringMid($couleur_RGB, 7, 2)) ; Local $MaxRvb = Int(255) ;Maximum d'une couleur RVB Local $MaxTsl = Int(240) ;Maximum d'une composante TSL Local $MaxComposanteRvb = Int(255) ;Maximum d'une composante RVB Local $MaxComposanteRvbFois2 = Int($MaxComposanteRvb * 2) ;Maximum d'une composante RVB multiplié par 2 Local $MaxTslSur2 = Int($MaxTsl / 2) ;Maximum d'une composante TSL divisé par 2 Local $MaxTslSur3 = Int($MaxTsl / 3) ;Maximum d'une composante TSL divisé par 3 Local $MaxTsl2Sur3 = Int($MaxTsl * 2 / 3) ;Maximum d'une composante TSL multiplié par 2 / 3 ; Dim $max Dim $min Dim $t, $s, $lum Dim $r, $v, $b ;1 - Pas de normalisation... ;2 - Trouver le maxi et le mini entre R, G et B $max = _Max(_Max($rouge, $vert), $bleu) $min = _Min(_Min($rouge, $vert), $bleu) ;3 - L = (maxi + mini) / 2.0 $lum = Floor(((($max + $min) * $MaxTsl) + $MaxRvb) / $MaxComposanteRvbFois2) ;4 - Si maxi = mini alors S = 0 et H = 0 If $max = $min Then $ret = "H=160"&",S=0"&",L="&Round($lum) return $ret; EndIf ;5 - Si L < 0.5 alors S = (maxi - mini) / (maxi + mini) If $lum <= $MaxTslSur2 Then $s = ((($max - $min) * $MaxTsl) + (($max + $min) / 2)) / ($max + $min) Else $s = ((($max - $min) * $MaxTsl) + ((($MaxComposanteRvbFois2 - $max) - $min) / 2)) / (($MaxComposanteRvbFois2 - $max) - $min) EndIf ;Avant 6 - Petite magouille pour normaliser avant les composants r, v, b $r = ((($max - $rouge) * 40) + (($max - $min) / 2)) / ($max - $min) $v = ((($max - $vert) * 40) + (($max - $min) / 2)) / ($max - $min) $b = ((($max - $bleu) * 40) + (($max - $min) / 2)) / ($max - $min) ;6 - Si R = max alors, T = (V - B) If $rouge = $max Then $t = $b - $v ElseIf $vert = $max Then $t = ($MaxTslSur3 + $r) - $b Else $t = ($MaxTsl2Sur3 + $v) - $r EndIf If $t < 0 Then $t += $MaxTsl ElseIf $t > $MaxTsl Then $t -= $MaxTsl EndIf $ret = "H="&Floor($t)&",S="&Floor($s)&",L="&Floor($lum) return $ret; ; EndFunc