2011年4月7日木曜日

C# RGB⇔HSVの交互変換

ペインターやフォトショのカラーピッカーに憧れがあるため、

ういきぺでぃあのHSVの項目
を元にC#でRGBtoHSVの交互変換を行えるクラスを書いてみました。
Hは0~360° SとVは0~255になってます。




コード
  1. //RGBからHSV  
  2. HSV hsv = new HSV(Color.Blue);  
  3. //HSVからRGB  
  4. Color col = hsv.ToColor();  
  5.     
こんなかんじで。


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

0 件のコメント:

コメントを投稿