2011年4月7日木曜日

C# RGB ⇔ HSV 相互変換 改

RGB⇔HSVができるHSVの構造体です。

コード



  1. //RGBからHSV  
  2. //  
  3. // HSVColor構造体  
  4. //  Hiroaki,Komori   
  5. //  
  6. using System;  
  7. using System.Drawing;  
  8. using System.Linq;  
  9.   
  10. public struct HSV  
  11. {  
  12.     private int _h;  
  13.     private int _s;  
  14.     private int _v;  
  15.   
  16.     public int H  
  17.     {  
  18.         get { return _h; }  
  19.         set { _h = value; }  
  20.     }  
  21.   
  22.     public int S  
  23.     {  
  24.         get { return _s; }  
  25.         set { _s = value; }  
  26.     }  
  27.   
  28.     public int V  
  29.     {  
  30.         get { return _v; }  
  31.         set { _v = value; }  
  32.     }  
  33.   
  34.     public HSV(int h, int s, int v)  
  35.     {  
  36.         _h = h;  
  37.         _s = s;  
  38.         _v = v;  
  39.     }  
  40.   
  41.     ///<summary>  
  42.     /// ColorからHSV  
  43.     ///</summary>  
  44.     ///<param name="”rgb”">    public HSV(Color rgb)  
  45.     {  
  46.         byte[] cols = new byte[] { rgb.R, rgb.G, rgb.B };  
  47.         double max = cols.Max();  
  48.         double min = cols.Min();  
  49.   
  50.         //Vを求める  
  51.         _v = (int)max;  
  52.   
  53.         //RGBすべてが同じ場合 HとSは0   
  54.         if (max == min)  
  55.         {  
  56.             _h = 0;  
  57.             _s = 0;  
  58.         }  
  59.         else  
  60.         {  
  61.             //Sを求める  
  62.             _s = (int)(((max - min) * 255) / max);  
  63.   
  64.             //Hを求める  
  65.             _h = 0;  
  66.   
  67.             if (max == rgb.R)  
  68.             {  
  69.                 _h = (int)(60 * (rgb.G - rgb.B) / (max - min));  
  70.                 if (_h < 0)  
  71.                 {  
  72.                     _h += 360;  
  73.                 }  
  74.             }  
  75.             else if (max == rgb.G)  
  76.             {  
  77.                 _h = (int)(60 * (2 + (rgb.B - rgb.R) / (max - min)));  
  78.                 if (_h < 0)  
  79.                 {  
  80.                     _h += 360;  
  81.                 }  
  82.             }  
  83.             else if (max == rgb.B)  
  84.             {  
  85.                 _h = (int)(60 * (4 + (rgb.R - rgb.G) / (max - min)));  
  86.                 if (_h < 0)  
  87.                 {  
  88.                     _h += 360;  
  89.                 }  
  90.             }  
  91.         }  
  92.     }  
  93.   
  94.     ///<summary>  
  95.     /// Colorへ変換  
  96.     ///</summary>  
  97.     ///<param name="”hsv”">///<returns></returns>  
  98.     public Color ToColor()  
  99.     {  
  100.         return HSV.FromRgb(_h, _s, _v);  
  101.     }  
  102.   
  103.     ///<summary>  
  104.     /// Colorへ変換  
  105.     ///</summary>  
  106.     ///<param name="”hsv”">///<returns></returns>  
  107.     public static Color FromRgb(HSV hsv)  
  108.     {  
  109.         return HSV.FromRgb(hsv.H, hsv.S, hsv.V);  
  110.     }  
  111.   
  112.     ///<summary>  
  113.     /// Colorへ変換  
  114.     ///</summary>  
  115.     ///<param name="”hsv”">///<returns></returns>  
  116.     public static Color FromRgb(int h, int s, int v)  
  117.     {  
  118.         if (h == 360)  
  119.         {  
  120.             h = 0;  
  121.         }  
  122.   
  123.         int Hi = (int)(Math.Floor(h / 60d) % 6);  
  124.   
  125.         int f = (int)((h / 60f) - Hi);  
  126.         int p = (int)((v / 255f) * (1 - (s / 255f)));  
  127.         int q = (int)((v / 255f) * (1 - f * (s / 255f)));  
  128.         int t = (int)((v / 255f) * (1 - (1 - f) * (s / 255f)));  
  129.   
  130.         p *= 255;  
  131.         q *= 255;  
  132.         t *= 255;  
  133.   
  134.         Color rgb = new Color();  
  135.   
  136.         switch (Hi)  
  137.         {  
  138.             case 0:  
  139.                 rgb = Color.FromArgb(v, t, p);  
  140.                 break;  
  141.             case 1:  
  142.                 rgb = Color.FromArgb(q, v, p);  
  143.                 break;  
  144.             case 2:  
  145.                 rgb = Color.FromArgb(p, v, t);  
  146.                 break;  
  147.             case 3:  
  148.                 rgb = Color.FromArgb(p, q, v);  
  149.                 break;  
  150.             case 4:  
  151.                 rgb = Color.FromArgb(t, p, v);  
  152.                 break;  
  153.             case 5:  
  154.                 rgb = Color.FromArgb(v, p, q);  
  155.                 break;  
  156.         }  
  157.   
  158.         return rgb;  
  159.     }  
  160.   
  161.     ///<summary>  
  162.     ///文字列に変換  
  163.     ///</summary>  
  164.     ///<returns></returns>  
  165.     public override string ToString()  
  166.     {  
  167.         string result = string.Format("HSV [H={0}, S={1}, V={2}]", _h, _s, _v);  
  168.         return result;  
  169.     }  
  170. }  

0 件のコメント:

コメントを投稿