【问题标题】:How to create pastel colors programmatically in C#?如何在 C# 中以编程方式创建柔和的颜色?
【发布时间】:2011-12-10 14:52:57
【问题描述】:

根据所需颜色的数量等间距生成它们。如果指定的计数为 8,则看起来像这样:

List<Color> GeneratePastelColors (int count)

【问题讨论】:

  • 如果是奇数怎么办?
  • 奇数或偶数应该相同,因为该方法将返回一个包含所有颜色的列表。图片仅代表:O
  • @Dani:Haterz 会讨厌,土豆会变味。
  • 它可能被否决了,因为它只是要求一个解决方案而没有说明到目前为止已经尝试过什么。它可能会让人觉得“请为我做我的工作”。

标签: c# .net algorithm colors


【解决方案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>

不是 C#,我知道,但只是想抓住亮点并坐下来。

否则,您可以查看样本颜色,看看 HSV/HSL 值是否存在相关性,并尝试从中推导出算法。如果您绘制 S/H 和 V/H,您会在图表中看到灰色的大幅下降 --- 这似乎是一个异常值。 (底行左起第三个。)忽略该值,S 约为 75%,而值略低于 90%。使用这些值可能会得到最好的结果。

链接:http://jsfiddle.net/ZHyAQ/

【讨论】:

  • 谢谢,这简化了问题,但不确定如何将它们转换为柔和。去饱和度 80% 是否准确?
  • 实际上,我尝试了 80%,但对结果并不十分满意。它可能只是用来试验的东西。
  • 谢谢,不胜感激。是的,让它们变成柔和的颜色会有点棘手。
  • 60% 的亮度似乎很好,饱和度高于 60%。我扩展了@Thanatos 的 jsfiddle 以用于每个饱和度和亮度组合(10% 步长),最后有 60% 的亮度和 60% 以上的饱和度:请参阅jsfiddle.net/bTFWb
【解决方案2】:

您还可以查看 Rich Newman 的 HSLColor 课程。他有一系列博客文章,以this one开头。

使用此代码,我能够生成一系列均匀分布在色轮周围的颜色,但如果要包含灰色阴影,则必须添加额外的逻辑。

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

【讨论】:

  • 如果使用 C++/Qt: color = QColor::fromHsl(i, 240, 160);
猜你喜欢
  • 1970-01-01
  • 2011-02-04
  • 1970-01-01
  • 2014-05-29
  • 2016-03-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-17
相关资源
最近更新 更多