2010-01-28 1 views
2

Я пытаюсь создать нижний градиент цвета (цвет синий на одном конце и красный на другом).Алгоритм для генерации цветовой градиент WaveLength в C#

alt text http://img.brothersoft.com/screenshots/softimage/w/wavelength-160945-1.jpeg

Я следовать предложению put forth here. Это мой код:

int rMax = Color.Red.R; 
int rMin = Color.Blue.R; 
// ... and for B, G 
var colorList = new List<Color>(); 
for(int i=0; i<size; i++) 
{ 
    var rAverage = rMin + (int)((rMax - rMin) * i/size); 
    // ... and for B, G 
    colorList.Add(Color.FromArgb(rAverage, gAverage, bAverage)); 
} 

Хотя результат я сделал показывает постепенный, плавный переход от красного к синему, но и другим промежуточным цветам, таким как желтая и зеленый не появлялся вообще.

Все, что я сделал не так?

ответ

4

Вы должны работать с цветами в цветовом пространстве HSL, а не в формате RGB. Это позволяет плавно изменять значение оттенка от 0 (красный) до 1 (фиолетовый). Структура System.Drawing.Color позволяет конвертировать из RBG в HSL (GetHue и т. Д.), Но не в другую сторону. Математика - simple though.

+1

Ознакомьтесь с http://www.bobpowell.net/rgbhsb.htm для кода преобразования .NET RGB/HSL – AakashM

+0

... Это именно то, что я сказал. –

1
int rMax = Color.Red.R; 
int rMin = Color.Blue.R; 
// ... and for B, G 
var colorList = new List<Color>(); 
for(int i=0; i<size; i++) 
{ 
    var rAverage = rMin + (int)((rMax - rMin) * i/size); 
    // ... and for B, G 
    colorList.Add(Color.FromArgb(rAverage, gAverage, bAverage)); 
} 

Вы настраиваете rMin = 0 и rMax = 255. Таким образом, вы, по сути установка

rAverage = 255 * i/size; 

У вас нет кода для gAverage и bAverage в списке, но если бы это было действительно эквивалент вы бы видеть постепенное trasition от черный-> серо-> белый, с не другие оттенки вообще.

Кажется вероятным, что вы хотите перебирать различные оттенки при постоянной яркости/насыщенности. См. here для примера класса C#, который делает это, и here для объяснения уравнения.

Смежные вопросы