ういきぺでぃあのHSVの項目を元にC#でRGBtoHSVの交互変換を行えるクラスを書いてみました。
Hは0~360° SとVは0~255になってます。
コード
//RGBからHSV HSV hsv = new HSV(Color.Blue); //HSVからRGB Color col = hsv.ToColor();こんなかんじで。
// // HSVColor構造体 // Hiroaki,Komori // using System; using System.Drawing; using System.Linq; public struct HSV { private int _h; private int _s; private int _v; public int H { get { return _h; } set { _h = value; } } public int S { get { return _s; } set { _s = value; } } public int V { get { return _v; } set { _v = value; } } public HSV(int h, int s, int v) { _h = h; _s = s; _v = v; } ////// ColorからHSV /// ///public HSV(Color rgb) { byte[] cols = new byte[] { rgb.R, rgb.G, rgb.B }; double max = cols.Max(); double min = cols.Min(); //Vを求める _v = (int)max; //RGBすべてが同じ場合 HとSは0 if (max == min) { _h = 0; _s = 0; } else { //Sを求める _s = (int)(((max – min) * 255) / max); //Hを求める _h = 0; if (max == rgb.R) { _h = (int)(60 * (rgb.G – rgb.B) / (max – min)); if (_h < 0) { _h += 360; } } else if (max == rgb.G) { _h = (int)(60 * (2 + (rgb.B – rgb.R) / (max – min))); if (_h < 0) { _h += 360; } } else if (max == rgb.B) { _h = (int)(60 * (4 + (rgb.R – rgb.G) / (max – min))); if (_h < 0) { _h += 360; } } } } ////// Colorへ変換 /// //////public Color ToColor() { return HSV.FromRgb(_h, _s, _v); } /// /// Colorへ変換 /// //////public static Color FromRgb(HSV hsv) { return HSV.FromRgb(hsv.H, hsv.S, hsv.V); } /// /// Colorへ変換 /// //////public static Color FromRgb(int h, int s, int v) { if (h == 360) { h = 0; } int Hi = (int)(Math.Floor(h / 60d) % 6); int f = (int)((h / 60f) – Hi); int p = (int)((v / 255f) * (1 – (s / 255f))); int q = (int)((v / 255f) * (1 – f * (s / 255f))); int t = (int)((v / 255f) * (1 – (1 – f) * (s / 255f))); p *= 255; q *= 255; t *= 255; Color rgb = new Color(); switch (Hi) { case 0: rgb = Color.FromArgb(v, t, p); break; case 1: rgb = Color.FromArgb(q, v, p); break; case 2: rgb = Color.FromArgb(p, v, t); break; case 3: rgb = Color.FromArgb(p, q, v); break; case 4: rgb = Color.FromArgb(t, p, v); break; case 5: rgb = Color.FromArgb(v, p, q); break; } return rgb; } /// ///文字列に変換 /// ///public override string ToString() { string result = string.Format("HSV [H={0}, S={1}, V={2}]", _h, _s, _v); return result; } }
0 件のコメント:
コメントを投稿