Алгоритм генерации градиента цвета WaveLength в C # - PullRequest
2 голосов
/ 28 января 2010

Я пытаюсь сгенерировать приведенный ниже градиент цвета (цвет синий на одном конце и красный на другом).

alt text
(источник: brothersoft.com )

Я следую предложению , выдвинутому здесь . Это мой код:

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));
}

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

Что-то я не так сделал?

Ответы [ 2 ]

4 голосов
/ 28 января 2010

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

1 голос
/ 28 января 2010
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 в списке, но если бы он был действительно эквивалентным, вы бы увидели постепенное переход от черного-> серого-> белого без других оттенков вообще.

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

...