2013-11-20 130 views
0

我試圖創建一個組合框在那裏我可以選擇一種顏色(這是後來用在畫線的座標圖)創建一個漂亮的調色板

我打aroung一點來是這樣的:

 int interval = 120; 

     for (int red = 0; red < 255; red += interval) 
     { 
      for (int green = 0; green < 255; green += interval) 
      { 
       for (int blue = 0; blue < 255; blue += interval) 
       { 
        if (red > 150 | blue > 150 | green > 150) //to make sure color is not too dark 
        { 
         ComboBoxItem item = new ComboBoxItem(); 
         item.Background = new SolidColorBrush(Color.FromArgb(255, (byte)(red), (byte)(green), (byte)(blue))); 
         item.Content = "#FF" + red.ToString("X2") + green.ToString("X2") + blue.ToString("X2"); 
         cmbColors.Items.Add(item); 
        } 
       } 
      } 
     } 

,這使得這樣的事情在這裏:

enter image description here

正如你可以看到我有顏色對,它看起來有點不可思議,不有人對此有更好的想法嗎? (我用WPF)

+3

考慮按色調而不是RGB值對顏色進行排序。這樣,顏色之間的轉換就不那麼震撼了。 –

+0

這看起來很奇怪嗎? –

+1

使用[Extended WPF Toolkit ColorPicker](http://wpftoolkit.codeplex.com/wikipage?title=ColorPicker)怎麼樣? – DamenEU

回答

1

您的要求是主觀的(「有點怪」不是一個準確表述的問題!),但通過色調對它們進行排序看起來是這樣的:

int interval = 120; 

    List<Color> colors = new List<Color>(); 
    for (int red = 0; red < 255; red += interval) 
    { 
     for (int green = 0; green < 255; green += interval) 
     { 
      for (int blue = 0; blue < 255; blue += interval) 
      { 
       if (red > 150 | blue > 150 | green > 150) //to make sure color is not too dark 
       { 
        colors.Add(Color.FromARGB(Color.FromArgb(255, (byte)(red), (byte)(green), (byte)(blue)); 
       } 
      } 
     } 
    } 
    var sortedColors = colors.OrderBy(c => c.GetHue()) 
           .ThenBy(c => c.GetSaturation()) 
           .ThenBy(c => c.GetBrightness()); 
    foreach (Color c in sortedColors) 
    {       
     ComboBoxItem item = new ComboBoxItem { 
      Background = new SolidColorBrush(c), 
      Content = string.Format("#{0:X8}", c.ToArgb()) 
     }; 
     cmbColors.Items.Add(item); 
    } 

如果不看足夠美觀,嘗試排列​​,GetSaturationGetBrightness調用,直到你很高興。