Недавно я наткнулся на диаграмму цвета .NET, основанную на их значении оттенка и яркости. Меня поразила сумасшедшая диаграмма в градациях серого. Например, DarkGray на самом деле светлее серого? Кроме того, я не вижу никакой логики в градации значений RGB, она идет от 0 до 105 до 128?
0 : Black
105 : DimGray
128 : Gray
169 : DarkGray!
192 : Silver
211 : LightGray
220 : Gainsboro
245 : Ghostwhite
255 : White
http://sites.google.com/site/cdeveloperresources/
![color chart - see link above](https://i.stack.imgur.com/WK3w9.png)
Мне нужен класс GrayScaleBrushes, который ведет себя точно так же, как класс Brushes, но с моей собственной схемой, например:
GrayScaleBrushes.Pct05
GrayScaleBrushes.Pct10
GrayScaleBrushes.Pct15
..all the way to.Pct95
...
ie: e.FillRectangle( GrayScaleBrushes.Pct05, exampleRect );
Как это сделать, убедившись, что щетки будут располагаться правильно?
Редактировать: Класс .NET Brushes выглядит следующим образом (разобран с помощью рефлектора).
public sealed class Brushes
{
// Fields
private static readonly object AliceBlueKey = new object();
// Methods
private Brushes()
{
}
// Properties
public static Brush AliceBlue
{
get
{
Brush brush = (Brush) SafeNativeMethods.Gdip.ThreadData[AliceBlueKey];
if (brush == null)
{
brush = new SolidBrush(Color.AliceBlue);
SafeNativeMethods.Gdip.ThreadData[AliceBlueKey] = brush;
}
return brush;
}
}
}
SafeNativeMethods мне кажется недоступным. Предположим, я только что возвратил SolidBrush в статическом методе, это заставило бы все располагаться правильно? (А как это проверить?)
public sealed class GrayScaleBrushes
{
private static SolidBrush pct05 = null;
public static SolidBrush Pct05
{
get
{
if (pct05 == null)
{
int rgbVal = GetRgbValFromPct( 5 );
pct05 = new SolidBrush(Color.FromArgb(rgbVal, rgbVal, rgbVal));
}
return pct05;
}
}
private static int GetRgbValFromPct(int pct)
{
return 255 - (int)(((float)pct / 100f) * 255f);
}
}