HSL <==> RGB

Übersicht BlitzBasic Codearchiv

Neue Antwort erstellen

 

Edlothiol

Betreff: HSL <==> RGB

BeitragFr, Jun 04, 2004 18:16
Antworten mit Zitat
Benutzer-Profile anzeigen
Das hat mich jetzt doch interessiert, deshalb habe ich ein bisschen gegooglet. Das ist rausgekommen:
HSL2RGB nimmt h,s,l als Parameter und setzt die globalen Variablen R,G und B. RGB2HSL eben andersrum.
Im HSL - Farbmodell gehen hier H von 0 bis 360 (359) und S und L von 0 bis 255. Beim normalen Windows - Farbwähler ist es H,S und L von 0 bis 239. Die Werte auf diese Bereiche umzurechnen sollte jedoch nicht allzu schwierig sein. Auf Geschwindigkeit hab ichs nicht getestet, ich weiß nicht ob es für Echtzeit einsetzbar ist.
BlitzBasic: [AUSKLAPPEN]

Function Max3#(v#,v2#,v3#)

Select True

Case v > v2 And v > v3: Return v
Case v2 > v And v2 > v3: Return v2
Default: Return v3

End Select

End Function
Function Min3#(v#,v2#,v3#)

Select True

Case v < v2 And v < v3: Return v
Case v2 < v And v2 < v3: Return v2
Default: Return v3

End Select

End Function

Global R,G,B
Function HSL2RGB(h#,s#,l#)
h = h / 360
s = s / 255
l = l / 255

If ( S = 0 ) Then
R = L * 255
G = L * 255
B = L * 255
Else
If ( L < 0.5 ) Then
Tmp2# = L * ( 1 + S )
Else
Tmp2 = ( L + S ) - ( S * L )
End If

Tmp1# = 2 * L - Tmp2

R = 255 * H2RGB( Tmp1, Tmp2, H + ( 1.0 / 3.0 ) )
G = 255 * H2RGB( Tmp1, Tmp2, H )
B = 255 * H2RGB( Tmp1, Tmp2, H - ( 1.0 / 3.0 ) )
End If
End Function

Function H2RGB#( v1#, v2#, v3# )

If ( v3 < 0 ) Then
v3 = v3 + 1
End If
If ( v3 > 1 ) Then
v3 = v3 - 1
End If

If ( ( 6.0 * v3 ) < 1 ) Then
Return ( v1 + ( v2 - v1 ) * 6.0 * v3 )
ElseIf ( ( 2.0 * v3 ) < 1 ) Then
Return v2
ElseIf ( ( 3.0 * v3 ) < 2 ) Then
Return ( v1 + ( v2 - v1 ) * ( ( 2.0 / 3.0 ) - v3 ) * 6.0 )
Else
Return v1
End If

End Function

Global H,S,L
Function RGB2HSL(r,g,b)

Local eH#, eS#, eL#

Local TmpR# = ( R / 255.0 )
Local TmpG# = ( G / 255.0 )
Local TmpB# = ( B / 255.0 )

Local TmpMin# = Min3( TmpR, TmpG, TmpB )

Local TmpMax# = Max3( TmpR, TmpG, TmpB )

Local DelMax# = TmpMax - TmpMin

eL = ( TmpMax + TmpMin ) * 0.5

If ( DelMax = 0 ) Then
eH = 0
eS = 0
Else
If ( eL < 0.5 ) Then
eS = DelMax / ( TmpMax + TmpMin )
Else
eS = DelMax / ( 2.0 - DelMax )
End If

Select TmpMax
Case TmpR:
eH = (TmpG - TmpB) / DelMax
Case TmpG:
eH = 2.0 + (TmpB - TmpR) / DelMax
Case TmpB:
eH = 4.0 + (TmpR - TmpG) / DelMax
End Select
eH = eH / 6.0

If ( eH < 0 ) Then
eH = eH + 1.0
End If
If ( eH > 1 ) Then
eH = eH - 1.0
End If
End If

DebugLog "eh: " + eh + " es: " + es + " el: " + el

H = eH * 360.0
S = eS * 255.0
L = eL * 255.0

End Function


Repeat

RGB2HSL(Input("R?"),Input("G?"),Input("B?"))
Print "H: " + H + " S: " + S + " L: " + L

HSL2RGB(Input("H?"),Input("S?"),Input("L?"))
Print "R: " + R + " G: " + G + " B: " + B

Forever
Die HSL2RGB - Berechnung ist noch ein bisschen ungenau.

Edit: Jetzt sollte es stimmen.
  • Zuletzt bearbeitet von Edlothiol am Sa, Jun 05, 2004 11:37, insgesamt 2-mal bearbeitet

Clonker

BeitragFr, Jun 04, 2004 19:09
Antworten mit Zitat
Benutzer-Profile anzeigen
Irgendwie stimmt das aber nicht ganz:

R:14 G:150 B:250
->
H:240 S:236 L:132

H:240 S:236 L:132
->
R:18 G:18 B:246 müßte aber eigenlich wiesder zu R:14 G:150 B:250
Die exzessive Akkumulation von Fremdwörtern suggeriert pseudointellektuelle Kompetenz.

Athlon XP 2800|Radeon 9600 Pro|512MB DDR RAM|240GB Festplatte
 

Edlothiol

BeitragFr, Jun 04, 2004 20:47
Antworten mit Zitat
Benutzer-Profile anzeigen
Tatsächlich... Vielleicht hätte ich es noch ein bisschen mehr testen sollen... Das scheint an der RGB2HSL - Routine zu liegen, 240/236/132 - 18/18/246 stimmt. Ich werd wohl noch mal schauen müssen...
 

Edlothiol

BeitragSa, Jun 05, 2004 11:15
Antworten mit Zitat
Benutzer-Profile anzeigen
Es ist jetzt immer noch nicht sonderlich genau, aber ungefähr sollte es jetzt stimmen Wink Naja ich werd weiter dran arbeiten...

Edit: Oder? Scheint immer noch Fehler zu geben...

Neue Antwort erstellen


Übersicht BlitzBasic Codearchiv

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group