OVH Cloud OVH Cloud

Dégradé d'une couleur

7 réponses
Avatar
NeoB
Bonjour à tous,

Je sèche un peu sur l'algorithme pour créer un dégradé de couleur.
Par exemple, j'ai une couleur qui est du bleu représentée en RGB de la sorte
: RGB(87,137,203)

Question :
Comment créer un dégradé de nuance (plus foncé ou plus clair) de bleu à
partir de cette couleur ?
Quel est la formule pour arriver à cela ?

J'ai téléchargé du code sur le net mais malgré cela, je ne comprends pas la
notion...
Merci pour vos éventuelles explications.

NeoB

7 réponses

Avatar
Loïc
NeoB a formulé ce vendredi :
)





Salut, voici la méthode que j'utilise pour faire ce genre de chose.

je converti les valeur rbg de la couleur en HSL (Teinte, saturation,
luminance).
A partir de cette valeur hsl j'incrémente la valeur correspondant à la
luminausité pour éclaircir la couleur ou je la décrémente pour
l'assombrir puis ensuite je fais une nouvelle convertion HSL => rgb.

Dans le système RGB c'est très compliqué de faire ce que tu souhaites
de façon claire. Avec le système hsp tu peux facilement jouer sur la
teinte de ta couleur sa saturation ainsi que sa luminausité comme je
viens de te le montrer.

Souhaites tu avoir une classe de convertion RGB => HSL ,HSL=>RGB ?

Loïc

--
Loïc
Avatar
Loïc
laissez moi 5 minutes et je poste un exemple complet pour faire un
dégradé

--
Loïc
Avatar
NeoB
Oui bien entendu ! Si cela peut répondre à mon besoin.

Guy

"Loïc" a écrit dans le message de
news:
NeoB a formulé ce vendredi :
>> )

Salut, voici la méthode que j'utilise pour faire ce genre de chose.

je converti les valeur rbg de la couleur en HSL (Teinte, saturation,
luminance).
A partir de cette valeur hsl j'incrémente la valeur correspondant à la
luminausité pour éclaircir la couleur ou je la décrémente pour
l'assombrir puis ensuite je fais une nouvelle convertion HSL => rgb.

Dans le système RGB c'est très compliqué de faire ce que tu souhaites
de façon claire. Avec le système hsp tu peux facilement jouer sur la
teinte de ta couleur sa saturation ainsi que sa luminausité comme je
viens de te le montrer.

Souhaites tu avoir une classe de convertion RGB => HSL ,HSL=>RGB ?

Loïc

--
Loïc



Avatar
[___FreGoLi___]
Un petit exemple en VB de conversion HSL <-> RGB

http://www.vbfrance.com/code.aspx?ID!726

Bonne lecture

"Loïc" a écrit :

NeoB a formulé ce vendredi :
>> )

Salut, voici la méthode que j'utilise pour faire ce genre de chose.

je converti les valeur rbg de la couleur en HSL (Teinte, saturation,
luminance).
A partir de cette valeur hsl j'incrémente la valeur correspondant à la
luminausité pour éclaircir la couleur ou je la décrémente pour
l'assombrir puis ensuite je fais une nouvelle convertion HSL => rgb.

Dans le système RGB c'est très compliqué de faire ce que tu souhaites
de façon claire. Avec le système hsp tu peux facilement jouer sur la
teinte de ta couleur sa saturation ainsi que sa luminausité comme je
viens de te le montrer.

Souhaites tu avoir une classe de convertion RGB => HSL ,HSL=>RGB ?

Loïc

--
Loïc




Avatar
pas-de-spam>Wanadoo.fr
Loïc a écrit :
NeoB a formulé ce vendredi :

)






Salut, voici la méthode que j'utilise pour faire ce genre de chose.

je converti les valeur rbg de la couleur en HSL (Teinte, saturation,
luminance).
A partir de cette valeur hsl j'incrémente la valeur correspondant à la
luminausité pour éclaircir la couleur ou je la décrémente pour
l'assombrir puis ensuite je fais une nouvelle convertion HSL => rgb.

Dans le système RGB c'est très compliqué de faire ce que tu souhaites de
façon claire. Avec le système hsp tu peux facilement jouer sur la teinte
de ta couleur sa saturation ainsi que sa luminausité comme je viens de
te le montrer.

Souhaites tu avoir une classe de convertion RGB => HSL ,HSL=>RGB ?

Loïc




Bonjour,

Oui moi je veux bien.

Car effectivement en RGB c'est pas pratique.




Christophe
Avatar
Loïc
NeoB a pensé très fort :
Oui bien entendu ! Si cela peut répondre à mon besoin.

Guy

"Loïc" a écrit dans le message de
news:
NeoB a formulé ce vendredi :
)





Salut, voici la méthode que j'utilise pour faire ce genre de chose.

je converti les valeur rbg de la couleur en HSL (Teinte, saturation,
luminance).
A partir de cette valeur hsl j'incrémente la valeur correspondant à la
luminausité pour éclaircir la couleur ou je la décrémente pour
l'assombrir puis ensuite je fais une nouvelle convertion HSL => rgb.

Dans le système RGB c'est très compliqué de faire ce que tu souhaites
de façon claire. Avec le système hsp tu peux facilement jouer sur la
teinte de ta couleur sa saturation ainsi que sa luminausité comme je
viens de te le montrer.

Souhaites tu avoir une classe de convertion RGB => HSL ,HSL=>RGB ?

Loïc

--
Loïc





Désolé pour le retard....


Copie/colle le code suivant dans un projet contenant une feuille
contenant un bouton Command1
Si tu as des questions n'hésite pas.








Option Explicit

Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)


'Note: RGB(0...255,0...255,0...255) et HSL(0...360,0...1,0...1)


Public Sub RGBtoHSL(ByVal R As Byte, ByVal G As Byte, ByVal B As Byte,
H As Single, S As Single, L As Single)

Dim Max As Single
Dim Min As Single
Dim delta As Single
Dim rR As Single, rG As Single, rB As Single


rR = R / 255: rG = G / 255: rB = B / 255

Max = pvMaximum(rR, rG, rB)
Min = pvMinimum(rR, rG, rB)
L = (Max + Min) / 2


If (Max = Min) Then
S = 0
H = 0


Else

If (L <= 0.5) Then
S = (Max - Min) / (Max + Min)
Else
S = (Max - Min) / (2 - Max - Min)
End If

delta = Max - Min
If (rR = Max) Then
H = (rG - rB) / delta
ElseIf (rG = Max) Then
H = 2 + (rB - rR) / delta
ElseIf (rB = Max) Then
H = 4 + (rR - rG) / delta
End If
End If
End Sub

Public Sub HSLtoRGB(ByVal H As Single, ByVal S As Single, ByVal L As
Single, R As Byte, G As Byte, B As Byte)

Dim rR As Single, rG As Single, rB As Single
Dim Min As Single, Max As Single


If (S = 0) Then
rR = L: rG = L: rB = L


Else
If (L <= 0.5) Then

Min = L * (1 - S)
Else

Min = L - S * (1 - L)
End If
Max = 2 * L - Min


If (H < 1) Then
rR = Max
If (H < 0) Then
rG = Min
rB = rG - H * (Max - Min)
Else
rB = Min
rG = H * (Max - Min) + rB
End If
ElseIf (H < 3) Then
rG = Max
If (H < 2) Then
rB = Min
rR = rB - (H - 2) * (Max - Min)
Else
rR = Min
rB = (H - 2) * (Max - Min) + rR
End If
Else
rB = Max
If (H < 4) Then
rR = Min
rG = rR - (H - 4) * (Max - Min)
Else
rG = Min
rR = (H - 4) * (Max - Min) + rG
End If
End If
End If
R = rR * 255: G = rG * 255: B = rB * 255
End Sub

Private Function pvMaximum(rR As Single, rG As Single, rB As Single) As
Single
If (rR > rG) Then
If (rR > rB) Then pvMaximum = rR Else pvMaximum = rB
Else
If (rB > rG) Then pvMaximum = rB Else pvMaximum = rG
End If
End Function

Private Function pvMinimum(rR As Single, rG As Single, rB As Single) As
Single
If (rR < rG) Then
If (rR < rB) Then pvMinimum = rR Else pvMinimum = rB
Else
If (rB < rG) Then pvMinimum = rB Else pvMinimum = rG
End If
End Function


Public Function RotateH40(ByVal H As Long) As Long
If (H > 200) Then RotateH40 = H - 240 Else RotateH40 = H
End Function


Private Sub Command1_Click()
Dim nRedValue As Byte
Dim nGreenValue As Byte
Dim nBlueValue As Byte

Dim nHue As Single
Dim nSaturation As Single
Dim nLightness As Single

Dim nCpt As Integer

'je prends les valeurs d'un bleu très foncé pour l'éclaircir dans la
prochaine boucle
nRedValue = 0
nGreenValue = 1
nBlueValue = 20


For nCpt = 1 To 255
Call RGBtoHSL(nRedValue, nGreenValue, nBlueValue, nHue,
nSaturation, nLightness)
nLightness = nLightness + 0.004 '0.004 = 1 / 255
If nLightness > 1 Then
nLightness = 1
End If

Call HSLtoRGB(nHue, nSaturation, nLightness, nRedValue,
nGreenValue, nBlueValue)
Me.BackColor = RGB(nRedValue, nGreenValue, nBlueValue)
Sleep (10)
Next nCpt
End Sub

--
Loïc
Avatar
Michel
Merci pour ce bout de code.
Comme je m'eduque en .Net je l'ai demarré en VB 2005.
A modifier les ByVal en ByRef pour les 3 dernieres valeurs
des procedures de conversion et surtout mettre un refresh
apres le Me.backcolor sinon rien de visible ne se passe.
Michel
Loïc a écrit :
NeoB a pensé très fort :

Oui bien entendu ! Si cela peut répondre à mon besoin.

Guy

"Loïc" a écrit dans le message de
news:

NeoB a formulé ce vendredi :

)






Salut, voici la méthode que j'utilise pour faire ce genre de chose.

je converti les valeur rbg de la couleur en HSL (Teinte, saturation,
luminance).
A partir de cette valeur hsl j'incrémente la valeur correspondant à la
luminausité pour éclaircir la couleur ou je la décrémente pour
l'assombrir puis ensuite je fais une nouvelle convertion HSL => rgb.

Dans le système RGB c'est très compliqué de faire ce que tu souhaites
de façon claire. Avec le système hsp tu peux facilement jouer sur la
teinte de ta couleur sa saturation ainsi que sa luminausité comme je
viens de te le montrer.

Souhaites tu avoir une classe de convertion RGB => HSL ,HSL=>RGB ?

Loïc

--
Loïc






Désolé pour le retard....


Copie/colle le code suivant dans un projet contenant une feuille
contenant un bouton Command1
Si tu as des questions n'hésite pas.








Option Explicit

Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)


'Note: RGB(0...255,0...255,0...255) et HSL(0...360,0...1,0...1)


Public Sub RGBtoHSL(ByVal R As Byte, ByVal G As Byte, ByVal B As Byte, H
As Single, S As Single, L As Single)

Dim Max As Single
Dim Min As Single
Dim delta As Single
Dim rR As Single, rG As Single, rB As Single


rR = R / 255: rG = G / 255: rB = B / 255

Max = pvMaximum(rR, rG, rB)
Min = pvMinimum(rR, rG, rB)
L = (Max + Min) / 2


If (Max = Min) Then
S = 0
H = 0


Else

If (L <= 0.5) Then
S = (Max - Min) / (Max + Min)
Else
S = (Max - Min) / (2 - Max - Min)
End If

delta = Max - Min
If (rR = Max) Then
H = (rG - rB) / delta
ElseIf (rG = Max) Then
H = 2 + (rB - rR) / delta
ElseIf (rB = Max) Then
H = 4 + (rR - rG) / delta
End If
End If
End Sub

Public Sub HSLtoRGB(ByVal H As Single, ByVal S As Single, ByVal L As
Single, R As Byte, G As Byte, B As Byte)

Dim rR As Single, rG As Single, rB As Single
Dim Min As Single, Max As Single


If (S = 0) Then
rR = L: rG = L: rB = L


Else
If (L <= 0.5) Then

Min = L * (1 - S)
Else

Min = L - S * (1 - L)
End If
Max = 2 * L - Min


If (H < 1) Then
rR = Max
If (H < 0) Then
rG = Min
rB = rG - H * (Max - Min)
Else
rB = Min
rG = H * (Max - Min) + rB
End If
ElseIf (H < 3) Then
rG = Max
If (H < 2) Then
rB = Min
rR = rB - (H - 2) * (Max - Min)
Else
rR = Min
rB = (H - 2) * (Max - Min) + rR
End If
Else
rB = Max
If (H < 4) Then
rR = Min
rG = rR - (H - 4) * (Max - Min)
Else
rG = Min
rR = (H - 4) * (Max - Min) + rG
End If
End If
End If
R = rR * 255: G = rG * 255: B = rB * 255
End Sub

Private Function pvMaximum(rR As Single, rG As Single, rB As Single) As
Single
If (rR > rG) Then
If (rR > rB) Then pvMaximum = rR Else pvMaximum = rB
Else
If (rB > rG) Then pvMaximum = rB Else pvMaximum = rG
End If
End Function

Private Function pvMinimum(rR As Single, rG As Single, rB As Single) As
Single
If (rR < rG) Then
If (rR < rB) Then pvMinimum = rR Else pvMinimum = rB
Else
If (rB < rG) Then pvMinimum = rB Else pvMinimum = rG
End If
End Function


Public Function RotateH40(ByVal H As Long) As Long
If (H > 200) Then RotateH40 = H - 240 Else RotateH40 = H
End Function


Private Sub Command1_Click()
Dim nRedValue As Byte
Dim nGreenValue As Byte
Dim nBlueValue As Byte

Dim nHue As Single
Dim nSaturation As Single
Dim nLightness As Single

Dim nCpt As Integer

'je prends les valeurs d'un bleu très foncé pour l'éclaircir dans la
prochaine boucle
nRedValue = 0
nGreenValue = 1
nBlueValue = 20


For nCpt = 1 To 255
Call RGBtoHSL(nRedValue, nGreenValue, nBlueValue, nHue,
nSaturation, nLightness)
nLightness = nLightness + 0.004 '0.004 = 1 / 255
If nLightness > 1 Then
nLightness = 1
End If

Call HSLtoRGB(nHue, nSaturation, nLightness, nRedValue,
nGreenValue, nBlueValue)
Me.BackColor = RGB(nRedValue, nGreenValue, nBlueValue)
Sleep (10)
Next nCpt
End Sub