HSL to RGB color conversion

后端 未结 21 3000
忘了有多久
忘了有多久 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:29

    Unity3D C# Code from Mohsen's answer.

    Here is the code from Mohsen's answer in C# targeted specifically for Unity3D. It was adapted from the C# answer given by Alec Thilenius above.

    using UnityEngine;
    using System.Collections;
    
    public class ColorTools {
    
        /// 
        /// 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] )**strong text**
        /// Output: Color ( R: [0.0, 1.0], G: [0.0, 1.0], B: [0.0, 1.0], A: [0.0, 1.0] )
        /// 
        /// Vector4 defining X = h, Y = s, Z = l, W = a. Ranges [0, 1.0]
        /// RGBA Color. Ranges [0.0, 1.0]
        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(r, g, b, hsl.w);
        }
    
        // 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;
        }
    
        /// 
        /// Converts an RGB color value to HSL.
        /// Input: Color ( R: [0.0, 1.0], G: [0.0, 1.0], B: [0.0, 1.0], A: [0.0, 1.0] )
        /// Output: Vector4 ( X: [0.0, 1.0], Y: [0.0, 1.0], Z: [0.0, 1.0], W: [0.0, 1.0] )
        /// 
        /// 
        /// 
        public static Vector4 RgbaToHsl(Color rgba)
        {
    
            float max = (rgba.r > rgba.g && rgba.r > rgba.b) ? rgba.r : 
                (rgba.g > rgba.b) ? rgba.g : rgba.b;
            float min = (rgba.r < rgba.g && rgba.r < rgba.b) ? rgba.r : 
                (rgba.g < rgba.b) ? rgba.g : rgba.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 (rgba.r > rgba.g && rgba.r > rgba.b)
                    h = (rgba.g - rgba.b) / d + (rgba.g < rgba.b ? 6.0f : 0.0f);
    
                else if (rgba.g > rgba.b)
                    h = (rgba.b - rgba.r) / d + 2.0f;
    
                else
                    h = (rgba.r - rgba.g) / d + 4.0f;
    
                h /= 6.0f;
            }
    
            return new Vector4(h, s, l, rgba.a);
        }
    
    }
    

提交回复
热议问题