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