rgb_to_hsb, hsb_to_rgb

Everything else that doesn't fall into one of the other PB categories.
AZJIO
Addict
Addict
Posts: 2191
Joined: Sun May 14, 2017 1:48 am

rgb_to_hsb, hsb_to_rgb

Post by AZJIO »

My version on AutoIt3

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
User avatar
Kwai chang caine
Always Here
Always Here
Posts: 5494
Joined: Sun Nov 05, 2006 11:42 pm
Location: Lyon - France

Re: rgb_to_hsb, hsb_to_rgb

Post by Kwai chang caine »

Can be usefull :wink:
Thanks for sharing 8)
ImageThe happiness is a road...
Not a destination
AZJIO
Addict
Addict
Posts: 2191
Joined: Sun May 14, 2017 1:48 am

Re: rgb_to_hsb, hsb_to_rgb

Post by AZJIO »

Used in Balloons game

I did this when I first started using PureBasic. Maybe I should use structure.

Code: Select all

Structure RGBA
    StructureUnion
        color.l
        byte.a[4]
    EndStructureUnion
EndStructure
User avatar
jacdelad
Addict
Addict
Posts: 2010
Joined: Wed Feb 03, 2021 12:46 pm
Location: Riesa

Re: rgb_to_hsb, hsb_to_rgb

Post by jacdelad »

Great, thanks AZJIO! This should be put to Tips and Tricks instead of General Discussion.
Good morning, that's a nice tnetennba!

PureBasic 6.21/Windows 11 x64/Ryzen 7900X/32GB RAM/3TB SSD
Synology DS1821+/DX517, 130.9TB+50.8TB+2TB SSD
Post Reply