C# 为标签获取好的颜色
C# get good color for label
我的 windows 表单应用程序的背景颜色是随机的。
现在我想显示一个标签。
但是当随机颜色为白色且标签也是白色时,标签不可见。
如何获得在我的背景颜色上可见的完美颜色(我的背景颜色是 System.Drawing.Color 中的随机颜色)
有多种方法可以确保适当的对比度。
选项一 : 我通常坚持保持文本黑色或白色,这取决于背景颜色的亮度。
要获得亮度,可以简单地使用内置函数 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)];
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().
构建颜色
您可以先反转每个通道,这样会产生很好的颜色对比;但如果颜色是中等亮度 and/or 饱和度,则您必须更正,也许再次选择黑色或白色..
注:上图我列举了所有KnownColors,看起来已经很随意了。
要添加一些顺序,您可以按颜色属性对列表进行排序,例如按色调,然后按亮度:
List<Color> allcolors = ((KnownColor[])Enum.GetValues(typeof(KnownColor)))
.Select(x => Color.FromKnownColor(x))
.OrderBy(x => x.GetHue()).ThenBy(x => getBrightness(x)).ToList();
我的 windows 表单应用程序的背景颜色是随机的。 现在我想显示一个标签。
但是当随机颜色为白色且标签也是白色时,标签不可见。
如何获得在我的背景颜色上可见的完美颜色(我的背景颜色是 System.Drawing.Color 中的随机颜色)
有多种方法可以确保适当的对比度。
选项一 : 我通常坚持保持文本黑色或白色,这取决于背景颜色的亮度。
要获得亮度,可以简单地使用内置函数 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)];
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().
构建颜色您可以先反转每个通道,这样会产生很好的颜色对比;但如果颜色是中等亮度 and/or 饱和度,则您必须更正,也许再次选择黑色或白色..
注:上图我列举了所有KnownColors,看起来已经很随意了。
要添加一些顺序,您可以按颜色属性对列表进行排序,例如按色调,然后按亮度:
List<Color> allcolors = ((KnownColor[])Enum.GetValues(typeof(KnownColor)))
.Select(x => Color.FromKnownColor(x))
.OrderBy(x => x.GetHue()).ThenBy(x => getBrightness(x)).ToList();