Je cherche un algorithme pour convertir une couleur HSL en RGB.
Il me semble que HSL n'est pas très largement utilisé et je n'ai pas beaucoup de chance dans la recherche d'un convertisseur.
Je cherche un algorithme pour convertir une couleur HSL en RGB.
Il me semble que HSL n'est pas très largement utilisé et je n'ai pas beaucoup de chance dans la recherche d'un convertisseur.
Garry Tan a publié une solution Javascript sur son blog (qu'il attribue à un défunt mjijackson.com), mais est archivé ici et l'auteur original a un aperçu - grâce à l'utilisateur2441511).
Le code est réaffiché ci-dessous :
/**
* 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)];
}
/**
* 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];
}
J'adore le fait que les commentaires m'indiquent la plage des variables et ce à quoi je dois m'attendre comme résultat. C'est très ordonné. Je vous remercie !
if(t < 0) t += 1; if(t > 1) t -= 1;
Y a-t-il une bonne raison pour que ce ne soit pas une else if
?
J'ai corrigé quelques trucs et j'en ai fait un module de nœuds : gist.github.com/mnbayazit/6513318
J'ai trouvé le moyen le plus simple, python à la sauvetage :D
colorsys.hls_to_rgb(h, l, s)
Convertir la couleur des coordonnées HLS en coordonnées RGB.
Je ne peux pas croire qu'il existe un tel module standard en Python ! Cela me sauve vraiment. Je me suis battu avec l'algorithme de conversion dans l'entrée HSL de Wikipedia pendant 2 heures. Il semble que cet algorithme ne puisse pas obtenir une sortie correcte.
Équivalent de Ruby : rubydoc.info/gems/color/1.8/Color/RGB par exemple Color::HSL.new(40,50,60).to_rgb
L'article pour HSL et HSV sur wikipedia contient quelques formules. Les calculs sont un peu délicats, il peut donc être utile de jeter un coup d'œil sur le site suivant implémentations existantes .
+1 Excellente réponse. Le lien était exactement ce que je cherchais. La réponse acceptée semble seulement utile pour python.
Si vous recherchez quelque chose qui soit absolument conforme à la sémantique CSS pour HSL et RGB, vous pouvez utiliser la méthode suivante l'algorithme spécifié dans la spécification CSS 3 qui se lit comme suit :
HOW TO RETURN hsl.to.rgb(h, s, l):
SELECT:
l<=0.5: PUT l*(s+1) IN m2
ELSE: PUT l+s-l*s IN m2
PUT l*2-m2 IN m1
PUT hue.to.rgb(m1, m2, h+1/3) IN r
PUT hue.to.rgb(m1, m2, h ) IN g
PUT hue.to.rgb(m1, m2, h-1/3) IN b
RETURN (r, g, b)
HOW TO RETURN hue.to.rgb(m1, m2, h):
IF h<0: PUT h+1 IN h
IF h>1: PUT h-1 IN h
IF h*6<1: RETURN m1+(m2-m1)*h*6
IF h*2<1: RETURN m2
IF h*3<2: RETURN m1+(m2-m1)*(2/3-h)*6
RETURN m1
Je crois que c'est la source de certaines des autres réponses ici.
Voici le code de la réponse de Mohsen en C# si quelqu'un d'autre le souhaite. Note : Color
est une classe personnalisée et Vector4
vient d'OpenTK. Les deux sont faciles à remplacer par quelque chose d'autre de votre choix.
/// <summary>
/// Converts an HSL color value to RGB.
/// Input: Vector4 ( X: [0.0, 1.0], Y: [0.0, 1.0], Z: [0.0, 1.0], W: [0.0, 1.0] )
/// Output: Color ( R: [0, 255], G: [0, 255], B: [0, 255], A: [0, 255] )
/// </summary>
/// <param name="hsl">Vector4 defining X = h, Y = s, Z = l, W = a. Ranges [0, 1.0]</param>
/// <returns>RGBA Color. Ranges [0, 255]</returns>
public static Color HslToRgba(Vector4 hsl)
{
float r, g, b;
if (hsl.Y == 0.0f)
r = g = b = hsl.Z;
else
{
var q = hsl.Z < 0.5f ? hsl.Z * (1.0f + hsl.Y) : hsl.Z + hsl.Y - hsl.Z * hsl.Y;
var p = 2.0f * hsl.Z - q;
r = HueToRgb(p, q, hsl.X + 1.0f / 3.0f);
g = HueToRgb(p, q, hsl.X);
b = HueToRgb(p, q, hsl.X - 1.0f / 3.0f);
}
return new Color((int)(r * 255), (int)(g * 255), (int)(b * 255), (int)(hsl.W * 255));
}
// Helper for HslToRgba
private static float HueToRgb(float p, float q, float t)
{
if (t < 0.0f) t += 1.0f;
if (t > 1.0f) t -= 1.0f;
if (t < 1.0f / 6.0f) return p + (q - p) * 6.0f * t;
if (t < 1.0f / 2.0f) return q;
if (t < 2.0f / 3.0f) return p + (q - p) * (2.0f / 3.0f - t) * 6.0f;
return p;
}
/// <summary>
/// Converts an RGB color value to HSL.
/// Input: Color ( R: [0, 255], G: [0, 255], B: [0, 255], A: [0, 255] )
/// Output: Vector4 ( X: [0.0, 1.0], Y: [0.0, 1.0], Z: [0.0, 1.0], W: [0.0, 1.0] )
/// </summary>
/// <param name="rgba"></param>
/// <returns></returns>
public static Vector4 RgbaToHsl(Color rgba)
{
float r = rgba.R / 255.0f;
float g = rgba.G / 255.0f;
float b = rgba.B / 255.0f;
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;
h = s = 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;
}
return new Vector4(h, s, l, rgba.A / 255.0f);
}
Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.
2 votes
Je viens de remarquer que le projet less.js comporte un certain nombre de fonctions de manipulation des couleurs, dont hsl_to_rgb : github.com/cloudhead/less.js/blob/master/lib/less/functions.js
1 votes
Du côté du navigateur - d3.js a une bonne API pour cela : github.com/mbostock/d3/wiki/Colors
0 votes
Caisse s'il vous plaît js
Please.HEX_to_HSV('#ffeb3b')
0 votes
Si vous êtes à la recherche d'un outil, rgb.to est bon.
4 votes
Marqué comme hors sujet alors qu'il s'agit d'une demande d'algorithme, qui est explicitement un "on-topic" à stackoverflow.com/help/on-topic -- qu'est-ce qui se passe ?
3 votes
C'est le pire vote de clôture que j'ai jamais vu sur ce site, et ce n'est pas peu dire ! Je suis le premier vote à rouvrir.
2 votes
J'ai posé cette question il y a dix ans et j'ai été surpris de voir les balises php et python ajoutées. Revenir à la formulation originale :)