Skip to content

Instantly share code, notes, and snippets.

@ciembor
Last active September 22, 2025 05:37
Show Gist options
  • Save ciembor/1494530 to your computer and use it in GitHub Desktop.
Save ciembor/1494530 to your computer and use it in GitHub Desktop.
RGB to HSL and HSL to RGB conversion functions
/*
* Copyright 2011 Maciej Ciemborowicz
* https://maciej-ciemborowicz.eu
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#define MIN(a,b) ((a)<(b)?(a):(b))
#define MAX(a,b) ((a)>(b)?(a):(b))
typedef struct rgb {
float r, g, b;
} RGB;
typedef struct hsl {
float h, s, l;
} HSL;
/*
* Converts an RGB color value to HSL. Conversion formula
* adapted from http://en.wikipedia.org/wiki/HSL_color_space.
* Assumes r, g, and b are contained in the set [0, 255] and
* returns HSL in the set [0, 1].
*/
HSL rgb2hsl(float r, float g, float b) {
HSL result;
r /= 255;
g /= 255;
b /= 255;
float max = MAX(MAX(r,g),b);
float min = MIN(MIN(r,g),b);
result.h = result.s = result.l = (max + min) / 2;
if (max == min) {
result.h = result.s = 0; // achromatic
}
else {
float d = max - min;
result.s = (result.l > 0.5) ? d / (2 - max - min) : d / (max + min);
if (max == r) {
result.h = (g - b) / d + (g < b ? 6 : 0);
}
else if (max == g) {
result.h = (b - r) / d + 2;
}
else if (max == b) {
result.h = (r - g) / d + 4;
}
result.h /= 6;
}
return result;
}
////////////////////////////////////////////////////////////////////////
/*
* Converts an HUE to r, g or b.
* returns float in the set [0, 1].
*/
float hue2rgb(float p, float q, float t) {
if (t < 0)
t += 1;
if (t > 1)
t -= 1;
if (t < 1./6)
return p + (q - p) * 6 * t;
if (t < 1./2)
return q;
if (t < 2./3)
return p + (q - p) * (2./3 - t) * 6;
return p;
}
////////////////////////////////////////////////////////////////////////
/*
* Converts an HSL color value to RGB. Conversion formula
* adapted from http://en.wikipedia.org/wiki/HSL_color_space.
* Assumes h, s, and l are contained in the set [0, 1] and
* returns RGB in the set [0, 255].
*/
RGB hsl2rgb(float h, float s, float l) {
RGB result;
if(0 == s) {
result.r = result.g = result.b = l * 255; // achromatic
}
else {
float q = l < 0.5 ? l * (1 + s) : l + s - l * s;
float p = 2 * l - q;
result.r = hue2rgb(p, q, h + 1./3) * 255;
result.g = hue2rgb(p, q, h) * 255;
result.b = hue2rgb(p, q, h - 1./3) * 255;
}
return result;
}
@qShuan
Copy link

qShuan commented Sep 11, 2023

This is what I've been searching for, I can't thank you enough! ;))

@Kimiberry64
Copy link

looks kinda messy ngl

@ciembor
Copy link
Author

ciembor commented Sep 17, 2025

@sixtyfourLEC Another one πŸ˜‚. How did you even find it? That was a solution to an exercise from university or something I wrote during converting color schemes to the Geany editor. 14 years ago πŸ˜‚.

@ciembor
Copy link
Author

ciembor commented Sep 17, 2025

@alpheratz0 fixed πŸ˜‚. Since this code has become so popular, I see no other choice but to maintain it πŸ˜‚. I also added the Apache license comment at the beginning, that says what I said before.

@Kimiberry64
Copy link

@sixtyfourLEC Another one πŸ˜‚. How did you even find it? That was a solution to an exercise from university. 14 years ago πŸ˜‚.

i found it randomly lmfao

@ciembor
Copy link
Author

ciembor commented Sep 17, 2025

@sixtyfourLEC but on Google or how? And what is messy? I don't code in C for a long time, I know there were some changes since C99 :).

@Kimiberry64
Copy link

@sixtyfourLEC but on Google or how? And what is messy? I don't code in C for a long time, I know there were some changes since C99 :).

google yes, the code looks very messy

@ciembor
Copy link
Author

ciembor commented Sep 17, 2025

@sixtyfourLEC I'm glad you still use search engines instead of LLM, because I can learn something. But you must tell me what is messy πŸ˜‚.

very-strong-code

@alpheratz0
Copy link

@alpheratz0 fixed πŸ˜‚. Since this code has become so popular, I see no other choice but to maintain it πŸ˜‚.

lets go!

I also added the Apache license comment at the beginning, that says what I said before.

noooo RIP "do what you want" license

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment