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

Uny*_*ath 1 c# forms windows drawing colors

我在Windows窗体应用程序中背景的颜色是随机的。现在我要显示一个标签。

但是,当随机颜色为白色且标签也为黑色时,则标签不可见。

如何获得完美的颜色,背景颜色可见(我的backgroundcolor是System.Drawing.Color中的随机颜色)

TaW*_*TaW 5

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

选项一:根据底色的亮度,我通常坚持使文本为黑色或白色。

在此处输入图片说明

要获得亮度,可以简单地使用内置函数Color.GetBrightness()

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

相反,此小函数将帮助:

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

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

Label lbl = new Label();
lbl.BackColor = colors[rnd.Next(colors.Count)];
lbl.ForeColor = getBrightness(lbl.BackColor) < 0.55 ? Color.White : Color.Black;
Run Code Online (Sandbox Code Playgroud)

该代码使用已知颜色的列表:

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

选项二:如果要在前景中获得颜色,则可以随机选择并重复进行,直到通过比较例如得到不错的对比度为止

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

请注意,您不得将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();
Run Code Online (Sandbox Code Playgroud)