Code: Select all
EnableExplicit
Declare rgb_to_hsb()
Declare hsb_to_rgb()
Global Dim arr_rgb(2)
Global Dim arr_hsb(2)
Define tmpColor, tmp$
tmpColor = Val("$" + "AB45DE")
arr_rgb(0) = Blue(tmpColor)
arr_rgb(1) = Green(tmpColor)
arr_rgb(2) = Red(tmpColor)
rgb_to_hsb()
hsb_to_rgb()
Debug RSet(Hex(arr_rgb(0)), 2, "0") + RSet(Hex(arr_rgb(1)), 2, "0") + RSet(Hex(arr_rgb(2)), 2, "0")
; 360 100 100
; Procedure hsb_to_rgb(Array arr_hsb)
Procedure hsb_to_rgb()
Protected sector
Protected.f ff, pp, qq, tt
Protected.f Dim af_rgb(2) ; создаём массивы в которых числа будут в диапазоне 0-1
Protected.f Dim af_hsb(2)
; Protected Dim arr_rgb(2)
af_hsb(2) = arr_hsb(2) /100
If arr_hsb(1) = 0 ; если серый, то одно значение всем
arr_rgb(0)=Round(af_hsb(2)*255, #PB_Round_Nearest)
arr_rgb(1)=arr_rgb(0)
arr_rgb(2)=arr_rgb(0)
; ProcedureReturn arr_rgb
EndIf
While arr_hsb(0)>=360 ; если тон задан большим запредельным числом, то
arr_hsb(0)-360
; arr_hsb(0) = Mod(arr_hsb(0), 360)
Wend
af_hsb(1) = arr_hsb(1) / 100
af_hsb(0) = arr_hsb(0) / 60
; sector = Int(arr_hsb(0))
sector = Round(af_hsb(0), #PB_Round_Down)
ff=af_hsb(0) - sector
pp=af_hsb(2)*(1-af_hsb(1))
qq=af_hsb(2)*(1-af_hsb(1)*ff)
tt=af_hsb(2)*(1-af_hsb(1)*(1-ff))
Select sector
Case 0
af_rgb(0)=af_hsb(2)
af_rgb(1)=tt
af_rgb(2)=pp
Case 1
af_rgb(0)=qq
af_rgb(1)=af_hsb(2)
af_rgb(2)=pp
Case 2
af_rgb(0)=pp
af_rgb(1)=af_hsb(2)
af_rgb(2)=tt
Case 3
af_rgb(0)=pp
af_rgb(1)=qq
af_rgb(2)=af_hsb(2)
Case 4
af_rgb(0)=tt
af_rgb(1)=pp
af_rgb(2)=af_hsb(2)
Default
af_rgb(0)=af_hsb(2)
af_rgb(1)=pp
af_rgb(2)=qq
EndSelect
; RGB
arr_rgb(0)=Round(af_rgb(0)*255, #PB_Round_Nearest)
arr_rgb(1)=Round(af_rgb(1)*255, #PB_Round_Nearest)
arr_rgb(2)=Round(af_rgb(2)*255, #PB_Round_Nearest)
; BGR
; arr_rgb(2)=Round(af_rgb(0)*255, #PB_Round_Nearest)
; arr_rgb(1)=Round(af_rgb(1)*255, #PB_Round_Nearest)
; arr_rgb(0)=Round(af_rgb(2)*255, #PB_Round_Nearest)
; ProcedureReturn arr_rgb
EndProcedure
Procedure rgb_to_hsb()
Protected.f min, max
If arr_rgb(0)<=arr_rgb(1)
min=arr_rgb(0)
max=arr_rgb(1)
Else
min=arr_rgb(1)
max=arr_rgb(0)
EndIf
If min>arr_rgb(2)
min=arr_rgb(2)
EndIf
If max<arr_rgb(2)
max=arr_rgb(2)
EndIf
If max = min
arr_hsb(0)=0
ElseIf max = arr_rgb(0)
arr_hsb(0)=60*(arr_rgb(1)-arr_rgb(2))/(max - min)
If arr_rgb(1)<arr_rgb(2)
arr_hsb(0)+360
EndIf
ElseIf max = arr_rgb(1)
arr_hsb(0)=60*(arr_rgb(2)-arr_rgb(0))/(max - min)+120
ElseIf max = arr_rgb(2)
arr_hsb(0)=60*(arr_rgb(0)-arr_rgb(1))/(max - min)+240
EndIf
If max = 0
arr_hsb(1)=0
Else
arr_hsb(1)=(1-min/max)*100
EndIf
arr_hsb(2)=max/255*100
arr_hsb(0)=Round(arr_hsb(0), #PB_Round_Nearest)
arr_hsb(1)=Round(arr_hsb(1), #PB_Round_Nearest)
arr_hsb(2)=Round(arr_hsb(2), #PB_Round_Nearest)
; ProcedureReturn arr_hsb
EndProcedure