2011-11-04 3 views
6

В C#, как я мог сгенерировать следующее изображение программным путем?Программно генерировать диаграмму цвета?

http://deathmatchgame.files.wordpress.com/2010/07/color_picker.png

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

Редактировать Обратите внимание, что меня не интересует правильная область изображения, в которой отображается только градиент серого.

+1

Graphics.DrawImage() является довольно быстро. Вам не нужно генерировать это изображение во время выполнения, вам нужно знать только обратное отображение позиции в цвет. –

ответ

3

Из взглядов это, это диаграмма цвета HSL. В приведенном ниже коде будет создан 2d-массив цветов, который должен соответствовать тому, что находится на изображении. Я оставил реализацию FromHSL до вас, а также о том, как получить из этого массива фактического изображения:

const int size = 1000; 
const double ratio = 1.0/size; 
const double saturation = 1.0; 
Color[,] colors = new Color[size,size]; 
for (int i = 0; i < size; i++) 
{ 
    double lightness = 1.0 - i*ratio; 
    for (int j = 0; j < size; j++) 
    { 
     double hue = j*ratio; 
     colors[i, j] = FromHSL(hue, saturation, lightness); 
    } 
} 
4

Это изображение является HSL (не HSV, белый S = 0 в HSV), S - на 100%, H - на горизонтальной оси, L - на вертикальной оси. (Градиент градации серого равен S = 0). Вы можете использовать преобразования в http://www.bobpowell.net/RGBHSB.htm и просто перебирать все пиксели в своем прямоугольнике.

Как простая палитра пипетки, это дает вам полностью насыщенные цвета (и серые, с битом справа).

Цветной выборщик окон, для сравнения, помещает S по вертикальной оси (с L = 50%) в большой квадрат, в результате чего серый снизу с отдельным ползунком для L. Это менее полезно в качестве пипетки палитра. Другая широко известная форма выбора цвета - это круг с оттенком вокруг круга и насыщенность в радиусе (как правило, он помещает белый в центр, используя HSV с V = 100 и отдельный ползунок для значения)

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