este problema se puede abordar de diferentes maneras, por lo tanto te dejamos la que para nosotros es la resolución más completa.
Solución:
Garry Tan publicó una solución Javascript en su blog (que él attributes a un mjijackson.com ahora desaparecido, pero está archivado aquí y el autor original tiene una esencia, gracias al usuario 2441511).
El código se vuelve a publicar a continuación:
HSL a RGB:
/**
* 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 r, g, and b in the set [0, 255].
*
* @param number h The hue
* @param number s The saturation
* @param number l The lightness
* @return Array The RGB representation
*/
function hslToRgb(h, s, l)
var r, g, b;
if(s == 0)
r = g = b = l; // achromatic
else
var hue2rgb = function hue2rgb(p, q, 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;
var q = l < 0.5 ? l * (1 + s) : l + s - l * s;
var p = 2 * l - q;
r = hue2rgb(p, q, h + 1/3);
g = hue2rgb(p, q, h);
b = hue2rgb(p, q, h - 1/3);
return [Math.round(r * 255), Math.round(g * 255), Math.round(b * 255)];
RGB a 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 h, s, and l in the set [0, 1].
*
* @param number r The red color value
* @param number g The green color value
* @param number b The blue color value
* @return Array The HSL representation
*/
function rgbToHsl(r, g, b)
r /= 255, g /= 255, b /= 255;
var max = Math.max(r, g, b), min = Math.min(r, g, b);
var h, s, l = (max + min) / 2;
if(max == min)
h = s = 0; // achromatic
else
var d = max - min;
s = l > 0.5 ? d / (2 - max - min) : d / (max + min);
switch(max)
case r: h = (g - b) / d + (g < b ? 6 : 0); break;
case g: h = (b - r) / d + 2; break;
case b: h = (r - g) / d + 4; break;
h /= 6;
return [h, s, l];
Encontré la forma más fácil, Python al rescate: D
colorsys.hls_to_rgb(h, l, s)
Convierta el color de las coordenadas HLS a las coordenadas RGB.
Implementación Java del código de Mohsen
Tenga en cuenta que todos los enteros se declaran como flotantes (es decir, 1f) y deben ser flotantes, de lo contrario, obtendrá colores grises.
HSL a RGB
/**
* 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 r, g, and b in the set [0, 255].
*
* @param h The hue
* @param s The saturation
* @param l The lightness
* @return int array, the RGB representation
*/
public static int[] hslToRgb(float h, float s, float l)
float r, g, b;
if (s == 0f)
r = g = b = l; // achromatic
else
float q = l < 0.5f ? l * (1 + s) : l + s - l * s;
float p = 2 * l - q;
r = hueToRgb(p, q, h + 1f/3f);
g = hueToRgb(p, q, h);
b = hueToRgb(p, q, h - 1f/3f);
int[] rgb = to255(r), to255(g), to255(b);
return rgb;
public static int to255(float v) return (int)Math.min(255,256*v);
/** Helper method that converts hue to rgb */
public static float hueToRgb(float p, float q, float t)
if (t < 0f)
t += 1f;
if (t > 1f)
t -= 1f;
if (t < 1f/6f)
return p + (q - p) * 6f * t;
if (t < 1f/2f)
return q;
if (t < 2f/3f)
return p + (q - p) * (2f/3f - t) * 6f;
return p;
RGB a HSL
/**
* Converts an RGB color value to HSL. Conversion formula
* adapted from http://en.wikipedia.org/wiki/HSL_color_space.
* Assumes pR, pG, and bpBare contained in the set [0, 255] and
* returns h, s, and l in the set [0, 1].
*
* @param pR The red color value
* @param pG The green color value
* @param pB The blue color value
* @return float array, the HSL representation
*/
public static float[] rgbToHsl(int pR, int pG, int pB)
float r = pR / 255f;
float g = pG / 255f;
float b = pB / 255f;
float max = (r > g && r > b) ? r : (g > b) ? g : b;
float min = (r < g && r < b) ? r : (g < b) ? g : b;
float h, s, l;
l = (max + min) / 2.0f;
if (max == min)
h = s = 0.0f;
else
float d = max - min;
s = (l > 0.5f) ? d / (2.0f - max - min) : d / (max + min);
if (r > g && r > b)
h = (g - b) / d + (g < b ? 6.0f : 0.0f);
else if (g > b)
h = (b - r) / d + 2.0f;
else
h = (r - g) / d + 4.0f;
h /= 6.0f;
float[] hsl = h, s, l;
return hsl;
Más adelante puedes encontrar las explicaciones de otros programadores, tú también puedes mostrar el tuyo si lo deseas.