A une époque lointaine j'avais codé des fonctions de conversion RGB vers HSL, voir ce
Code : Tout sélectionner
; Procédure pour conversion RGB<->HSL
;
; ©.2011 TazNormand
; En TSL (HSL en anglais), la teinte est un angle de 0 à 360°
; La saturation une valeur de 0 à 100%, de même pour la luminosité 0 à 100%
; Variables
Global.f Hue,Sat,Light
Global.l Rouge,Vert,Bleu,Alph
; Déclarations
Declare RGB2HSL(ColR.i,ColG.i,ColB.i)
Declare HSL2RGB(VHue.f,VSat.f,VLit.f)
Declare.f Hue2RGB(Val1.f,Val2.f,Val_H.f)
Declare.f Mini2(val_1.f,val_2.f)
Declare.f Mini3(val_1.f,val_2.f,val_3.f)
Declare.f Maxi2(val_1.f,val_2.f)
Declare.f Maxi3(val_1.f,val_2.f,val_3.f)
; Procédures
Procedure RGB2HSL(ColR.i,ColG.i,ColB.i)
var_R.f=(ColR/255)
var_G.f=(ColG/255)
var_B.f=(ColB/255)
var_Min.f=Mini3(var_R,var_G,var_B)
var_Max.f=Maxi3(var_R,var_G,var_B)
del_Max.f=var_Max - var_Min
Light=((var_Max + var_Min) / 2)*100
If del_Max=0
Hue=0
Sat=0
Else
If Light<=0.5
Sat=(del_Max / (var_Max + var_Min))*100
Else
Sat=(del_Max / (2 - (var_Max + var_Min)))*100
EndIf
del_R.f=(((var_Max - var_R) / 6) + (del_Max / 2)) / del_Max
del_G.f=(((var_Max - var_G) / 6) + (del_Max / 2)) / del_Max
del_B.f=(((var_Max - var_B) / 6) + (del_Max / 2)) / del_Max
If var_R=var_Max
Hue=del_B - del_G
Hue=((60 * ((var_g - var_b) / del_max)) + 360); % 360
;Else
ElseIf var_G=var_Max
Hue=(1 / 3) + del_R - del_B
Hue=(60 * ((var_b - var_r) / del_Max)+120)
ElseIf var_B=var_Max
Hue=(2 / 3) + del_G - del_R
Hue=360*Hue
EndIf
;EndIf
If Hue<0
Hue+360
EndIf
If Hue>360
Hue-360
EndIf
EndIf
EndProcedure
Procedure HSL2RGB(VHue.f,VSat.f,VLit.f)
vHue/360
VSat/100
VLit/100
If VSat=0
Rouge=VLit * 255
Vert= VLit * 255
Bleu= VLit * 255
Else
If VLit<0.5
tmp_2.f=VLit * (1 + VSat)
Else
tmp_2.f=(VLit + VSat) - (VSat * VLit)
EndIf
tmp_1.f=(2 * VLit) - tmp_2
Rouge=Int(255 * Hue2RGB(tmp_1,tmp_2,VHue + (1 / 3)))
Vert =Int(255 * Hue2RGB(tmp_1,tmp_2,VHue))
Bleu =Int(255 * Hue2RGB(tmp_1,tmp_2,VHue - (1 / 3)))
EndIf
EndProcedure
Procedure.f Hue2RGB(Val1.f,Val2.f,Val_H.f)
If Val_H<0
Val_H+1
EndIf
If Val_H>1
Val_H-1
EndIf
If (6 * Val_H)<1
tmp.f=(Val1 + (Val2 - Val1) * 6 * Val_H)
ProcedureReturn tmp
EndIf
If (2 * Val_H)<1
tmp.f=Val2
ProcedureReturn tmp
EndIf
If (3 * Val_H)<2
tmp.f=(Val1 + (Val2 - Val1) * ((2 / 3) - Val_H) * 6)
ProcedureReturn tmp
EndIf
ProcedureReturn Val1
EndProcedure
Procedure.f Mini3(val_1.f,val_2.f,val_3.f)
tmp_1.f=Mini2(val_1,val_2)
min_3.f=Mini2(tmp_1,val_3)
ProcedureReturn min_3
EndProcedure
Procedure.f Maxi3(val_1.f,val_2.f,val_3.f)
tmp_1.f=Maxi2(val_1,val_2)
max_3.f=Maxi2(tmp_1,val_3)
ProcedureReturn max_3
EndProcedure
; Minimum entre 2 valeurs
Procedure.f Mini2(val_1.f,val_2.f)
If val_1<=val_2
minimum2.f=val_1
Else
minimum2.f=val_2
EndIf
ProcedureReturn minimum2
EndProcedure
; Maximum entre 2 valeurs
Procedure.f Maxi2(val_1.f,val_2.f)
If val_1<=val_2
maximum2.f=val_2
Else
maximum2.f=val_1
EndIf
ProcedureReturn maximum2
EndProcedure
#ScrW = 640
#ScrH = 480
#ScrD = 32
If InitSprite() = 0 Or InitKeyboard() = 0
MessageRequester( "Erreur" , "Initialisations impossibles", 0)
End
ElseIf OpenScreen( #ScrW , #ScrH , #ScrD , "HSL Plasma" ) = 0
MessageRequester( "Erreur" , "Ouverture écran impossible" , 0 )
End
EndIf
H.f=180
S.f=50
L.f=50
Repeat
ExamineKeyboard()
StartDrawing(ScreenOutput())
DrawText(0,00,"E pour Hue-, R pour Hue+",RGB(255,255,255))
DrawText(0,20,"D pour Sat-, F pour Sat+",RGB(255,255,255))
DrawText(0,40,"C pour Light-, V pour Light+",RGB(255,255,255))
DrawText(0,60,"Escape pour sortir",RGB(255,0,0))
DrawText(300,00,"Hue : "+Str(H)+"° ",RGB(255,255,255))
DrawText(300,20,"Sat : "+Str(S)+"% ",RGB(255,255,255))
DrawText(300,40,"Lit : "+Str(L)+"% ",RGB(255,255,255))
DrawText(400,00,"Rouge : "+Str(Rouge)+" ",RGB(255,255,255))
DrawText(400,20,"Vert : "+Str(Vert)+" ",RGB(255,255,255))
DrawText(400,40,"Bleu : "+Str(Bleu)+" ",RGB(255,255,255))
If KeyboardPushed(#PB_Key_E)
H-1
If H<0:H=359:EndIf
EndIf
If KeyboardPushed(#PB_Key_R)
H+1
If H>360:H=0:EndIf
EndIf
If KeyboardPushed(#PB_Key_D)
S-1
If S<0:S=0:EndIf
EndIf
If KeyboardPushed(#PB_Key_F)
S+1
If S>100:S=100:EndIf
EndIf
If KeyboardPushed(#PB_Key_C)
L-1
If L<0:L=0:EndIf
EndIf
If KeyboardPushed(#PB_Key_V)
L+1
If L>100:L=100:EndIf
EndIf
hsltransform=HSL2RGB(H,S,L)
Box(100,100,200,200,RGB(Rouge,Vert,Bleu))
StopDrawing()
FlipBuffers()
Until KeyboardPushed(#PB_Key_Escape)