HSL to RGB color conversion

后端 未结 21 2617
忘了有多久
忘了有多久 2020-11-22 01:59

I am looking for a JavaScript / PHP algorithm to convert between HSL color to RGB.

It seems to me that HSL is not very widely used so I am not having much luck search

21条回答
  •  南笙
    南笙 (楼主)
    2020-11-22 02:19

    C++ implementation with probably better performance than @Mohsen code. It uses a [0-6] range for the hue, avoiding the division and multiplication by 6. S and L range is [0,1]

    void fromRGBtoHSL(float rgb[], float hsl[])
    {
         const float maxRGB = max(rgb[0], max(rgb[1], rgb[2]));
         const float minRGB = min(rgb[0], min(rgb[1], rgb[2]));
         const float delta2 = maxRGB + minRGB;
         hsl[2] = delta2 * 0.5f;
    
         const float delta = maxRGB - minRGB;
         if (delta < FLT_MIN)
             hsl[0] = hsl[1] = 0.0f;
         else
         {
             hsl[1] = delta / (hsl[2] > 0.5f ? 2.0f - delta2 : delta2);
             if (rgb[0] >= maxRGB)
             {
                 hsl[0] = (rgb[1] - rgb[2]) / delta;
                 if (hsl[0] < 0.0f)
                     hsl[0] += 6.0f;
             }
             else if (rgb[1] >= maxRGB)
                 hsl[0] = 2.0f + (rgb[2] - rgb[0]) / delta;
             else
                 hsl[0] = 4.0f + (rgb[0] - rgb[1]) / delta;
         }
    }
    
    void fromHSLtoRGB(const float hsl[], float rgb[])
    {
        if(hsl[1] < FLT_MIN)
            rgb[0] = rgb[1] = rgb[2] = hsl[2];
        else if(hsl[2] < FLT_MIN)
            rgb[0] = rgb[1] = rgb[2] = 0.0f;
        else
        {
            const float q = hsl[2] < 0.5f ? hsl[2] * (1.0f + hsl[1]) : hsl[2] + hsl[1] - hsl[2] * hsl[1];
            const float p = 2.0f * hsl[2] - q;
            float t[] = {hsl[0] + 2.0f, hsl[0], hsl[0] - 2.0f};
    
            for(int i=0; i<3; ++i)
            {
                if(t[i] < 0.0f)
                    t[i] += 6.0f;
                else if(t[i] > 6.0f)
                    t[i] -= 6.0f;
    
                if(t[i] < 1.0f)
                    rgb[i] = p + (q - p) * t[i];
                else if(t[i] < 3.0f)
                    rgb[i] = q;
                else if(t[i] < 4.0f)
                    rgb[i] = p + (q - p) * (4.0f - t[i]);
                else
                    rgb[i] = p;
              }
          }
    }
    

提交回复
热议问题