Esempio n. 1
0
        public static HSVColor RGBtoHSV(RGBColor rgb)
        {
            float max, min;
            HSVColor hsv = new HSVColor();

            min = Math.Min(Math.Min(rgb.R, rgb.G), rgb.B);
            max = Math.Max(Math.Max(rgb.R, rgb.G), rgb.B);

            hsv.V = max;
            if (hsv.V < .0001f)
            {
                hsv.H = hsv.S = 0;
                return hsv;
            }

            rgb.R /= hsv.V;
            rgb.G /= hsv.V;
            rgb.B /= hsv.V;
            min = Math.Min(Math.Min(rgb.R, rgb.G), rgb.B);
            max = Math.Max(Math.Max(rgb.R, rgb.G), rgb.B);

            hsv.S = max - min;
            if (hsv.S < .0001f)
            {
                hsv.H = 0;
                return hsv;
            }

            rgb.R = (rgb.R - min) / (max - min);
            rgb.G = (rgb.G - min) / (max - min);
            rgb.B = (rgb.B - min) / (max - min);
            min = Math.Min(Math.Min(rgb.R, rgb.G), rgb.B);
            max = Math.Max(Math.Max(rgb.R, rgb.G), rgb.B);

            if (Math.Abs(max - rgb.R) < .0001f)
            {
                hsv.H = 1f/6f * (rgb.G - rgb.B);
                if (hsv.H < 0)
                {
                    hsv.H += 1f;
                }
            }
            else if (Math.Abs(max - rgb.G) < .0001f)
            {
                hsv.H = 2f/6f + 1f/6f * (rgb.B - rgb.R);
            }
            else /* rgb_max == rgb.b */
            {
                hsv.H = 4f/6f + 1f/6f * (rgb.R - rgb.G);
            }

            hsv.Alpha = rgb.Alpha;

            return hsv;
        }
Esempio n. 2
0
        public static RGBColor HSVtoRGB(HSVColor hsv)
        {
            float r, g, b;
            float h, s, v;

            r = g = b = 0;

            h = hsv.H;
            s = hsv.S;
            v = hsv.V;

            if (hsv.H > 1)
            {
                hsv.H = hsv.H - (float)Math.Floor(hsv.H); //Rounds down and gives us the remander
            }
            float chroma = hsv.V * hsv.S;
            float hdash = hsv.H * 6f;
            float x = chroma * (1f - Math.Abs((hdash % 2) - 1f));

            if (hdash < 1f)
            {
                r = chroma;
                g = x;
            }
            else if (hdash < 2f)
            {
                g = chroma;
                r = x;
            }
            else if (hdash < 3f)
            {
                g = chroma;
                b = x;
            }
            else if (hdash < 4f)
            {
                b = chroma;
                g = x;
            }
            else if (hdash < 5f)
            {
                b = chroma;
                r = x;
            }
            else if (hdash < 6f)
            {
                r = chroma;
                b = x;
            }
            float min = hsv.V - chroma;
            r += min;
            g += min;
            b += min;

            return new RGBColor(r,g,b,hsv.Alpha);
        }