239 votes

Conversion des couleurs HSL en RGB

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.

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')

376voto

Mohsen Points 16856

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 :

HSL vers 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)];
}

RVB vers 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];
}

20 votes

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 !

1 votes

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 ?

0 votes

J'ai corrigé quelques trucs et j'en ai fait un module de nœuds : gist.github.com/mnbayazit/6513318

46voto

hhafez Points 13240

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.

8 votes

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.

2 votes

Équivalent de Ruby : rubydoc.info/gems/color/1.8/Color/RGB par exemple Color::HSL.new(40,50,60).to_rgb

1 votes

J'utilise brython pour obtenir un sélecteur de couleurs dans le navigateur, c'est exactement ce dont j'avais besoin !

20voto

Otto Allmendinger Points 11853

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 votes

+1 Excellente réponse. Le lien était exactement ce que je cherchais. La réponse acceptée semble seulement utile pour python.

0 votes

Voici un algorithme plus simple que celui du wiki stackoverflow.com/a/54014428/860099

15voto

jameshfisher Points 3033

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.

0 votes

Voici un algorithme plus simple stackoverflow.com/a/54014428/860099

9voto

Alec Thilenius Points 160

Code C# de la réponse de Mohsen.

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.

Hsl à Rgba

/// <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;
}

Rgba à Hsl

/// <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);
}

0 votes

Voici un algorithme plus simple que celui du wiki : stackoverflow.com/a/54014428/860099

Prograide.com

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.

Powered by:

X