C#でRGBからHSVへ変換

色を赤(Red)、緑(Green)、青(Blue)で表現するのがRGBカラーモデル。

Color構造体などはRGBに透過度(Alpha)を加えた4つの要素で値を持っている。

 

色を色相(Hue)、彩度(Saturation・Chroma)、明度(Value・Lightness・Brightness)で表現するのが

HSVモデル。

RGBとHSVはそれぞれ以下のように変換できる。

RGBからHSVへ変換

        public static void RGBtoHSV(float r, float g, float b, out float h, out float s, out float v)
        {
            float min = Math.Min(Math.Min(r, g), b);
            float max = Math.Max(Math.Max(r, g), b);

            h = max - min;
            if (0.0f < h)
            {
                if (max == r)
                {
                    h = (g - b) / h;
                    if (h < 0.0f)
                    {
                        h += 6.0f;
                    }
                }
                else if (max == g)
                {
                    h = 2.0f + (b - r) / h;
                }
                else
                {
                    h = 4.0f + (r - g) / h;
                }
            }
            h /= 6.0f;
            s = (max - min);
            if (0.0 < max) s /= max;
            v = max;
        }

HSVからRGBへ変換

        public static void HSVtoRGB(float h, float s, float v, out float r, out float g, out float b)
        {
            r = v;
            g = v;
            b = v;
            if (0.0f < s)
            {
                h *= 6.0f;
                int   i = (int)h;
                float f = h - (float)i;
                switch (i)
                {
                    default:
                    case 0:
                        g *= 1 - s * (1 - f);
                        b *= 1 - s;
                        break;
                    case 1:
                        r *= 1 - s * f;
                        b *= 1 - s;
                        break;
                    case 2:
                        r *= 1 - s;
                        b *= 1 - s * (1 - f);
                        break;
                    case 3:
                        r *= 1 - s;
                        g *= 1 - s * f;
                        break;
                    case 4:
                        r *= 1 - s * (1 - f);
                        g *= 1 - s;
                        break;
                    case 5:
                        g *= 1 - s;
                        b *= 1 - s * f;
                        break;
                }
            }
        }