Public Function ToRGB(ByVal cH As Double, _ ByVal cL As Double, _ ByVal cS As Double, _ ByRef cR As Long, _ ByRef cG As Long, _ ByRef cB As Long) 'Convertion HSL -> RVB If cS = 0 Then 'Si la saturation est nulle, on a une couleur 'en niveaux de gris, la teinte n'est pas importante 'on applique la valeur de L partout cR = cL * 255 cG = cR cB = cG Else Dim rM1 As Double Dim rM2 As Double 'Ici on a deux cas : pour L<0.5 on assombrit 'et pour L>0.5 on éclaircit If cL <= 0.5 Then rM2 = cL + cL * cS Else rM2 = cL + cS - cL * cS End If rM1 = 2 * cL - rM2 'Une fois les coefficients énoncés, on 'calcule a partir de la luminosité et de 'la teinte la couleur correspondante '(RGB = 3 couleurs = 1/3 de cercle = 120°) cR = ConvertRm(rM1, rM2, cH + 120) cG = ConvertRm(rM1, rM2, cH) cB = ConvertRm(rM1, rM2, cH - 120) End If End Function Public Function ConvertRm(ByVal rM1 As Double, _ ByVal rM2 As Double, _ ByVal cH As Double) 'Calcul de la couleur en fonction de 'rM1, rM2 (Luminosité et Saturation) 'et cH, la teinte 'Si on fait plus de 360° ou moins de 0° If cH > 360 Then cH = cH - 360 If cH < 0 Then cH = cH + 360 If cH < 60 Then 'Angle entre 0° et 60° (1/6 de cercle) rM1 = rM1 + (rM2 - rM1) * cH / 60 ElseIf cH < 180 Then 'Angle entre 60° et 180° (1/3 de cercle) rM1 = rM2 ElseIf cH < 240 Then 'Angle entre 180° et 240° (1/6 de cercle) rM1 = rM1 + (rM2 - rM1) * (240 - cH) / 60 End If 'On convertit la valeur entre '0 et 1 en un Byte entre 0 et 255 ConvertRm = rM1 * 255 End Function Public Function Min(A, B, C) As Long If A < B Then If A < C Then Min = A Else Min = C End If Else If B < C Then Min = B Else Min = C End If End If End Function Public Function Max(A, B, C) As Long 'Cette fonction renvoie la 'valeur du plus grand élément des trois 'arguments If A > B Then If A > C Then Max = A Else Max = C End If Else If B > C Then Max = B Else Max = C End If End If End Function Public Function ToHLS(ByVal cR As Long, _ ByVal cG As Long, _ ByVal cB As Long, _ ByRef cH As Double, _ ByRef cL As Double, _ ByRef cS As Double) 'Ici on convertit une couleur RGB en HSL Dim MinVal As Long Dim MaxVal As Long Dim mDiff As Long Dim mSum As Long Dim rNorm As Double Dim gNorm As Double Dim bNorm As Double 'Valeur maximum et minimum de couleur MinVal = Min(cR, cG, cB) MaxVal = Max(cR, cG, cB) 'Différence entre Max et Min mDiff = MaxVal - MinVal 'Somme de Max et Min mSum = MaxVal + MinVal '(255+255) = 510 donc 'on calcule la luminosité en faisant la moyenne '(MaxVal + MinVal)/2 'puis en divisant par 255 pour avoir 'un nombre entre 0 et 1 cL = mSum / 510 If MaxVal = MinVal Then 'Si Max = Min, alors la troisième couleur 'est elle aussi égale a Max et Min 'R=G=B, nous sommes en nuances de gris 'pas de teinte, saturation nulle cS = 0 cH = 0 Else 'Calcul des coefficients : 'Normale = (Max - Couleur) / (Max - Min) rNorm = (MaxVal - cR) / mDiff gNorm = (MaxVal - cG) / mDiff bNorm = (MaxVal - cB) / mDiff 'Pareil, si cL < 1/2 alors on assombrit, sinon on eclaircit cS = IIf(cL <= 0.5, (mDiff / mSum), (mDiff / (510 - mSum))) 'En fonction de la couleur dominante, on change 'la Teinte '60 × 6 = 360° If cR = MaxVal Then cH = 60 * (6 + bNorm - gNorm) '60 × 2 = 120° If cG = MaxVal Then cH = 60 * (2 + rNorm - bNorm) '60 × 4 = 240° If cB = MaxVal Then cH = 60 * (4 + gNorm - rNorm) 'Si on dépasse un tour If cH > 360 Then cH = cH - 360 End If End Function Public Function GetRGB(ByVal Col As Long, _ ByRef R As Long, _ ByRef G As Long, _ ByRef B As Long) 'Méthode logique pour récupérer les valeurs RGB 'd'une couleur B = Col \ (vbGreen + 1) Col = Col Mod (vbGreen + 1) G = Col \ (vbRed + 1) R = Col Mod (vbRed + 1) End Function Public Function GetTSL(ByVal Col As Long, _ ByRef T As Double, _ ByRef S As Double, _ ByRef L As Double) 'Méthode pour récupérer directement 'le code TSL d'une couleur Dim R As Long Dim G As Long Dim B As Long GetRGB Col, R, G, B ToHLS R, G, B, T, L, S End Function