C# 为标签获得良好的颜色

问题描述 投票:0回答:1

我在 Windows 窗体应用程序中使用随机颜色作为背景。现在我想显示一个标签。

问题是,当随机颜色为白色且标签太多时,则标签不可见。

如何获得在背景颜色上可见的完美颜色? (我的背景颜色是来自

System.Drawing.Color
的随机颜色。)

c# windows forms colors drawing
1个回答
12
投票

有多种方法可以确保适当的对比度。

选项一:我通常坚持将文本保持为黑色或白色,具体取决于背景颜色的亮度。

要获取亮度,只需使用内置函数 Color.GetBrightness()

不幸的是,这并不是一个很好的解决方案,因为结果在感知上并不正确;也就是说:绿色和黄色具有相同的值,这显然不是我们的眼睛所感知的。

相反,这个小功能会有所帮助:

float getBrightness(Color c) 
{  return (c.R * 0.299f + c.G * 0.587f + c.B *0.114f) / 256f; }

现在我们可以选择黑色或白色:

Label lbl = new Label();
lbl.BackColor = colors[rnd.Next(colors.Count)];   // get a random color
lbl.ForeColor = getBrightness(lbl.BackColor) < 0.55 ? Color.White : Color.Black;

代码使用已知颜色列表:

List<Color> colors = ((KnownColor[])Enum.GetValues(typeof(KnownColor))).
                     Select(x => Color.FromKnownColor(x)).ToList();

选项二:如果您想在前景中获得颜色,您可以随机选择它并重复,直到通过比较获得合适的对比度

while (Math.Abs(c1.GetBrightness() - c2.GetBrightness()) < 0.5f ) 
            c2 = colors[rnd.Next(colors.Count)];

请注意,您不能将 epsilon 值设置得太高,否则它将找不到合适的颜色。当试图找到距离中等亮度太远的颜色时,就会发生这种情况!您可以添加一个计数器,一段时间后选择简单的黑色或白色..


选项三:另一种方法是使用 Color.FromArgb().

构造颜色

您可以从反转每个通道开始,这将产生漂亮的颜色对比;但如果颜色具有中等亮度和/或饱和度,您就必须进行纠正,也许再次选择黑色或白色..


注意:对于上面的图像,我已经枚举了所有KnownColors,它看起来已经相当随机了。

要添加一些顺序,您可以按颜色属性对列表进行排序,例如按色调,然后按亮度:

List<Color> allcolors = ((KnownColor[])Enum.GetValues(typeof(KnownColor)))
    .Select(x => Color.FromKnownColor(x))
    .OrderBy(x => x.GetHue()).ThenBy(x => getBrightness(x)).ToList();
© www.soinside.com 2019 - 2024. All rights reserved.