RGB <=> HSV - Umrechner

Hier könnt Ihr gute, von Euch geschriebene Codes posten. Sie müssen auf jeden Fall funktionieren und sollten möglichst effizient, elegant und beispielhaft oder einfach nur cool sein.
Benutzeravatar
Tommy
Spassvogel
Beiträge: 319
Registriert: 17.10.2013 14:36

RGB <=> HSV - Umrechner

Beitrag von Tommy »

Code gelöscht weil der nich mir gehörte.
Zuletzt geändert von Tommy am 27.01.2015 12:07, insgesamt 2-mal geändert.
PB 5.41 x64
Benutzeravatar
JMaker
Beiträge: 102
Registriert: 19.01.2015 10:18

Re: RGB <=> HSV - Umrechner

Beitrag von JMaker »

danke Tommy
gut zu wissen dass man es machen kann, aber eine Frage, braucht man HSV in pb? eigentlich nur rgb oder?
Aber wenn man ein Bildeditor erstellt kann man den Code gut gebrauchen. :)
Ich benutze Pure Basic 5.30 auf Microsoft Windows 7.
Gruß
JM
Benutzeravatar
HeX0R
Beiträge: 3040
Registriert: 10.09.2004 09:59
Computerausstattung: AMD Ryzen 7 5800X
96Gig Ram
NVIDIA GEFORCE RTX 3060TI/8Gig
Win11 64Bit
G19 Tastatur
2x 24" + 1x27" Monitore
Glorious O Wireless Maus
PB 3.x-PB 6.x
Oculus Quest 2 + 3
Kontaktdaten:

Re: RGB <=> HSV - Umrechner

Beitrag von HeX0R »

Ich habe selten einen so verworrenen Code gesehen :freak:

Wieso diese irre Macro-Verschachtelungs-Orgie und nicht einfach so in der Art:

Code: Alles auswählen

Procedure.d GetMax(a.d, b.d, c.d)
	Protected Result.d
	
	Result = a
	If b > Result
		Result = b
	EndIf
	If c > Result
		Result = c
	EndIf
	
	ProcedureReturn Result
EndProcedure

Procedure.d GetMin(a.d, b.d, c.d)
	Protected Result.d
	
	Result = a
	If b < Result
		Result = b
	EndIf
	If c < Result
		Result = c
	EndIf
	
	ProcedureReturn Result
EndProcedure

Procedure RGB2HSV(Red, Green, Blue, *H.INTEGER, *S.DOUBLE, *V.DOUBLE)
	Protected R.d, G.d, B.d, Max.d, Min.d
	Protected H, S.d, V.d
	
	R   = Red / 255
	G   = Green / 255
	B   = Blue / 255
	Max = GetMax(R, G, B)
	Min = GetMin(R, G, B)
	
	If Max = Min
		*H\i = 0
	ElseIf Max = R
		*H\i = 60 * ((G - B) / (Max - Min))
	ElseIf Max = G
		*H\i = 60 * (2 + ((B - R) / (Max - Min)))
	Else
		*H\i = 60 * (4 + ((R - G) / (Max - Min)))
	EndIf
	If *H\i < 0
		*H\i + 360
	EndIf
	
	*S\d = 0.0
	If Max > 0.0
		*S\d = (Max - Min) / Max
	EndIf
	*V\d = Max
	
EndProcedure

Procedure HSV2RGB(H, S.d, V.d, *R.INTEGER, *G.INTEGER, *B.INTEGER)
	Protected hi, f.d, p.d, q.d, t.d, R.d, G.d, B.d
	
	hi = H / 60
	f  = (H / 60) - hi
	p  = V * (1 - S)
	q  = V * (1 - S * f)
	t  = V * (1 - S * (1 - f))
	Select hi
		Case 0, 6
			R = V : G = t : B = p
		Case 1
			R = q : G = V : B = p
		Case 2
			R = p : G = V : B = t
		Case 3
			R = p : G = q : B = V
		Case 4
			R = t : G = p : B = V
		Case 5
			R = V : G = p : B = q
	EndSelect
	
	*R\i = R * 255
	*G\i = G * 255
	*B\i = B * 255
EndProcedure

;example
CompilerIf #PB_Compiler_IsMainFile
	
Procedure main()
	Protected Red, Green, Blue, H, S.d, V.d
	
	RGB2HSV(255, 128, 64, @H, @S, @V)
	Debug "RGB 255, 128, 64 => H:" + Str(H) + "°, S = " + StrD(S * 100, 1) + "%, V = " + StrD(V * 100, 1) + "%"
	
	HSV2RGB(H, S, V, @Red, @Green, @Blue)
	Debug "HSV " + Str(H) + "°, " + StrD(S * 100, 1) + "%, " + StrD(V * 100, 1) + "% => R:" + Str(Red) + ", G:" + Str(Green) + ", B:" + Str(Blue)
	
	RGB2HSV(71, 58, 171, @H, @S, @V)
	Debug "RGB 255, 128, 64 => H:" + Str(H) + "°, S = " + StrD(S * 100, 1) + "%, V = " + StrD(V * 100, 1) + "%"
	
	HSV2RGB(H, S, V, @Red, @Green, @Blue)
	Debug "HSV " + Str(H) + "°, " + StrD(S * 100, 1) + "%, " + StrD(V * 100, 1) + "% => R:" + Str(Red) + ", G:" + Str(Green) + ", B:" + Str(Blue)
	
	
	
	
EndProcedure

main()

CompilerEndIf
Gesperrt