Вы можете использовать цвет HSB (оттенок, насыщенность, яркость) вместо цвета RGB. .Net может автоматически преобразовывать цвета RGB в HSB (с помощью методов Color.GetHue, .GetSaturation и .GetBrightness), но не идет в другом направлении. Вот пример кода, который обрабатывает преобразование цветов HSB в RGB:
http://splinter.com.au/blog/?p=29
(этот пример кода использует «V» вместо «B», вероятно, для «значения» вместо «яркости»).
Преимущество использования цвета HSB заключается в том, что параметр Hue находится в диапазоне от 0 до 360 и может интерпретироваться как позиция на цветовом круге, поэтому значения можно плавно перевернуть с 360 на 0. Для ваших целей вы можете создать цвета, установив для значений насыщенности и яркости значение 1,0 (их максимумы), а затем изменив значение оттенка, чтобы создать различные цвета спектра.
Что касается вашего конкретного вопроса (и уточнения ответа Рубенса), вы можете создать цвет из любого значения int32
, например:
int i = 4837429;
Color color = Color.FromArgb(i);
Однако это не приведет к эффекту цветного перехода, который вы описали в своем вопросе, и на самом деле большая часть различий в значениях int32
(при условии, что вы находитесь в диапазоне от MinValue до MaxValue) будет применяться к альфа-канал или непрозрачность, которая не звучит так, как вы хотите.
Обновление : вот что должно делать то, что вам нужно:
private const double ONE_SIXTH =
0.16666666666666666666666666666667;
private const double ONE_THIRD =
0.33333333333333333333333333333333;
private const double TWO_THIRDS =
0.66666666666666666666666666666667;
private const double FIVE_SIXTHS =
0.83333333333333333333333333333333;
public Color WheelColor(double d)
{
if ((d < 0.0) || (d > 1.0))
{
throw new ArgumentOutOfRangeException("d",
d, "d must be between 0.0 and 1.0, inclusive");
}
double R = 1;
double G = 1;
double B = 1;
if (d < ONE_SIXTH)
{
G = d / ONE_SIXTH;
B = 0;
}
else if (d < ONE_THIRD)
{
R = 1 - ((d - ONE_SIXTH) / ONE_SIXTH);
B = 0;
}
else if (d < 0.5)
{
R = 0;
B = (d - ONE_THIRD) / ONE_SIXTH;
}
else if (d < TWO_THIRDS)
{
R = 0;
G = 1 - ((d - 0.5) / ONE_SIXTH);
}
else if (d < FIVE_SIXTHS)
{
R = (d - TWO_THIRDS) / ONE_SIXTH;
G = 0;
}
else
{
B = 1 - ((d - FIVE_SIXTHS) / ONE_SIXTH);
G = 0;
}
return Color.FromArgb((int)(R * 255),
(int)(G * 255), (int)(B * 255));
}
Параметр d
в WheelColor предназначен для перехода от 0,0 до 1,0 и будет циклически проходить через цветовое колесо (своего рода), начиная с красного при d = 0,0 и возвращаясь к красному при d = 1,0.