WPF将RGB转为HSL的工具类

时间:2023-03-08 23:41:08
WPF将RGB转为HSL的工具类
class HSLColor
    {
        private int _alpha = 255;
        public int _hue = 0;
        public double _saturation = 1d;
        public double _lightness = 1d;
        //public double H;
        //public double S;
        //public double L;
        public HSLColor()
        {
        }
        public HSLColor(Color color)
        {
            _alpha = color.A;
            FromRGB(color);
            //double h = 0;
            //double s = 0;
            //double l = 0;
            //RGB2HSL(color, out h, out s, out l);
            //H = 255 * h;
            //S = 255 * s;
            //L = 255 * l;
        }
        private void FromRGB(Color color)
        {
            double r = ((double)color.R) / 255;
            double g = ((double)color.G) / 255;
            double b = ((double)color.B) / 255;
            double min = Math.Min(Math.Min(r, g), b);
            double max = Math.Max(Math.Max(r, g), b);
            double distance = max - min;
            _lightness = (max + min) / 2;
            if (distance == 0)
            {
                _hue = 0;
                _saturation = 0;
            }
            else
            {
                double hueTmp;
                _saturation =
                    (_lightness < 0.5) ?
                    (distance / (max + min)) : (distance / ((2 - max) - min));
                double tempR = (((max - r) / 6) + (distance / 2)) / distance;
                double tempG = (((max - g) / 6) + (distance / 2)) / distance;
                double tempB = (((max - b) / 6) + (distance / 2)) / distance;
                if (r == max)
                {
                    hueTmp = tempB - tempG;
                }
                else if (g == max)
                {
                    hueTmp = (0.33333333333333331 + tempR) - tempB;
                }
                else
                {
                    hueTmp = (0.66666666666666663 + tempG) - tempR;
                }
                if (hueTmp < 0)
                {
                    hueTmp += 1;
                }
                if (hueTmp > 1)
                {
                    hueTmp -= 1;
                }
                _hue = (int)(hueTmp * 250);
                _saturation = _saturation * 240;
                _lightness = _lightness * 200;
            }
        }
         public static void RGB2HSL(Color rgb, out double h, out double s, out double l)
         {
             double r = rgb.R / 255.0;
             double g = rgb.G / 255.0;
             double b = rgb.B / 255.0;
             double v;
             double m;
             double vm;
             double r2, g2, b2;
             h = 0; // default to black
             s = 0;
             l = 0;
             v = Math.Max(r, g);
             v = Math.Max(v, b);
             m = Math.Min(r, g);
             m = Math.Min(m, b);
             l = (m + v) / 2.0;
             if (l <= 0.0)
             {
                 return;
             }
             vm = v - m;
             s = vm;
             if (s > 0.0)
             {
                 s /= (l <= 0.5) ? (v + m) : (2.0 - v - m);
             }
             else
             {
                 return;
             }
             r2 = (v - r) / vm;
             g2 = (v - g) / vm;
             b2 = (v - b) / vm;
             if (r == v)
             {
                 h = (g == m ? 5.0 + b2 : 1.0 - g2);
             }
             else if (g == v)
             {
                 h = (b == m ? 1.0 + r2 : 3.0 - b2);
             }
             else
             {
                 h = (r == m ? 3.0 + g2 : 5.0 - r2);
             }
             h /= 6.0;
         }
    }