Подтвердить что ты не робот

Как создать пастельные цвета программно в С#?

Чтобы создать их одинаково разнесенные на основе количества желаемых цветов. Что-то похожее на это, если 8 указано для указанного количества:

List<Color> GeneratePastelColors (int count)

enter image description here

4b9b3361

Ответ 1

Вы найдете цвета, с которыми легче работать в таких проблемах, если вы используете HSV вместо RGB.

"одинаково разнесенные цвета" почти всегда означает "одинаково разнесенные оттенки". Таким образом, для [0,360) в оттенке вы просто равны в пространстве, разделив этот диапазон в равной степени.

Теперь у вас есть оттенок, и вам просто нужно найти "пастельную" версию этого оттенка. Для меня это означает обесцвечивание цвета. Я бы сказал, что на 80% насыщен для стартеров.

В моих тестах я использовал 100% для значения. Затем просто конвертируйте в RGB. Вот то, с чем я играл:

<body>
<script>
// taken from http://ariya.blogspot.com/2008/07/converting-between-hsl-and-hsv.html
function hsv_to_hsl(s, v)
{
    var ss, ll;
    ll = (2. - s) * v;
    ss = 1. * s * v;
    ss /= (ll <= 1.) ? (ll) : 2. - ll;
    ll /= 2.;

    return [ss, ll];
}

function do_colors(sat, light)
{
    n = 15;
    document.write(n + " colors at " + sat + "% sat, " + light + "% lightness<br />");
    for(var x = 0; x < n; ++x)
    {
        hue = 360.0 / n * x;
        html_chunk = "<div style='width: 50px; height: 50px; display: inline-block; background: hsl(" + hue + ", " + sat + "%, " + light + "%);'>&nbsp;</div>";
        document.write(html_chunk);
    }
    document.write("<br />");
}

do_colors(100, 50);
do_colors(95, 75);
do_colors(75, 50);
do_colors(100, 35);

// rudimentary averages from your colors
sl = hsv_to_hsl(.7, .9);
s = sl[0] * 100;
l = sl[1] * 100;
do_colors(s, l);
do_colors(75, 60);
</script>
</body>

Не С#, я знаю, но просто пытаюсь прибить свет и сел.

В противном случае вы можете посмотреть на свои образцы цветов и посмотреть, есть ли какая-либо корреляция в значениях HSV/HSL, и попытайтесь получить от этого алгоритм. Если вы построите S/H и V/H, вы увидите большое падение на графике на сером цвете --- кажется, это выброс. (Третий слева на нижней строке.) Игнорируя это значение, S составляет около 75%, а значение составляет чуть менее 90%. Использование этих значений, вероятно, дало наилучший результат.

Ссылка: http://jsfiddle.net/ZHyAQ/

Ответ 2

Вы также можете взглянуть на класс Rich Newman HSLColor. У него есть серия сообщений в блоге, начиная с этого.

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

private void button1_Click(object sender, EventArgs e) 
{ 
    listView1.Items.Clear(); 

    int step = 240 / 8; 

    for (int i = 0; i < 240; i += step) 
    { 
        HSLColor color = new HSLColor((double)i, 240, 160); 
        listView1.Items.Add(i.ToString()).BackColor = color; 
    }                
}

enter image description here