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

 

posted @ 2018-03-06 17:16  程序猿kid  阅读(163)  评论(0编辑  收藏  举报