Code archives/Graphics/RGB <=> HSL
This code has been declared by its author to be Public Domain code.
Download source code
| |||||
| Converts colors from the RGB system, which is used to paint the colors on the screen, into the more natural HSL system. (and back) In contrast to the original version, this code uses only integer calculation and therefore it was 2x to 3x faster in my test. In practice the speedup may be less, since ReadPixelFast() and WritePixelFast() take more time than the conversion. - - - Wandelt Farben vom RGB-System, das für die Darstellung auf dem Bildschirm benutzt wird, in das natürlichere HSL-System um. (und zurück) Im Gegensatz zur Originalversion verwendet dieses Programm nur Integer-Arithmetik und war daher 2x bis 3x schneller in meinem Test. In der Praxis wird der Unterschied weniger groß sein, da ReadPixelFast() und WritePixelFast() mehr Zeit benötigen als die eigentliche Umwandlung. - - - See for the original version: / Für die Originalversion siehe: http://www.blitzbasic.com/codearcs/codearcs.php?code=1540 | |||||
Global ret_h%, ret_s%, ret_l%
Global ret_R%, ret_G%, ret_B%
Graphics 360, 276, 0, 2
AppTitle "HSL Demo"
SetFont LoadFont("Arial", 20)
Color 255, 255, 255
LockBuffer()
MS% = MilliSecs()
For Y% = 0 To 255
For X% = 0 To 359
hsl_to_rgb(X%, 255 - Y%, 128)
WritePixel X%, Y%, ret_r% Shl 16 Or ret_g% Shl 8 Or ret_b%
Next
Next
MS% = MilliSecs() - MS%
UnlockBuffer
Text 2, 256, MS% + " millisecs taken. Press any key to end."
WaitKey
; Converts a RGB color to hsl.
;
; Params:
; R, G, B: red, green & blur in range [0-255]
;
; Returns:
; ret_h - Hue component [0-255].
; ret_s - Saturation component [0-255].
; ret_l - Luminance component [0-359].
Function rgb_to_hsl(R%, G%, B%)
If R% > G% Then
max_is% = 0
max_color% = R%
min_color% = G%
Else
max_is% = 1
max_color% = G%
min_color% = R%
EndIf
If B% > max_color% Then
max_is% = 2
max_color% = B%
ElseIf B% < min_color%
min_color% = B%
EndIf
ret_l% = (max_color% + min_color%) Shr 1 ; Luminance
If max_color% = min_color%
; Color is grey.
ret_s% = 0
Else
delta% = max_color% - min_color%
; Saturation
If ret_l% < 128 Then
ret_s% = 255 * delta% / (max_color% + min_color%)
Else
ret_s% = 255 * delta% / (512 - max_color% - min_color%)
EndIf
; Hue
Select max_is%
Case 0 ; Red
ret_h% = 60 * (G% - B%) / delta%
Case 1 ; Green
ret_h% = 120 + 60 * (B% - R%) / delta%
Case 2 ; Blue
ret_h% = 240 + 60 * (R% - G%) / delta%
End Select
If ret_h% < 0 Then ret_h% = ret_h% + 360
EndIf
End Function
; Converts a HSL color to RGB.
;
; Params:
; h, s, l - Color's hue [0-359], saturation [0-255] and luminance [0-255] components.
;
; Returns:
; The converted color's RGB values via the following globals:
; ret_R%, ret_G%, ret_B% in [0-255]
Function hsl_to_rgb(h%, s%, l%)
If s% = 0 Then
ret_r% = l%
ret_g% = l%
ret_b% = l%
Else
If l% < 128 Then temp2% = l% * (255 + s%) / 255 Else temp2% = (l% + s%) - (l% * s%) / 255
temp1% = 2 * l% - temp2%
rtemp3% = h% + 120
If rtemp3% > 360 Then rtemp3% = rtemp3% - 360
gtemp3% = h%
btemp3% = h% + 240
If btemp3% > 360 Then btemp3% = btemp3% - 360
If rtemp3% < 60 Then ; Set red
ret_R% = temp1% + (temp2% - temp1%) * rtemp3% / 60
ElseIf rtemp3% < 180 Then
ret_R% = temp2%
ElseIf rtemp3% < 240 Then
ret_R% = temp1% + (temp2% - temp1%) * (240 - rtemp3%) / 60
Else
ret_R% = temp1%
EndIf
If gtemp3% < 60 Then ; Set green
ret_G% = temp1% + (temp2% - temp1%) * gtemp3% / 60
ElseIf gtemp3% < 180 Then
ret_G% = temp2%
ElseIf gtemp3% < 240 Then
ret_G% = temp1% + (temp2% - temp1%) * (240 - gtemp3%) / 60
Else
ret_G% = temp1%
EndIf
If btemp3% < 60 Then ; Set blue
ret_B% = temp1% + (temp2% - temp1%) * btemp3% / 60
ElseIf btemp3% < 180 Then
ret_B% = temp2%
ElseIf btemp3% < 240 Then
ret_B% = temp1% + (temp2% - temp1%) * (240 - btemp3%) / 60
Else
ret_B% = temp1%
EndIf
EndIf
End Function |
Comments
None.
Code Archives Forum