首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C#获得良好的标签颜色

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

Stack Overflow用户
提问于 2018-05-26 07:14:21
回答 1查看 5.6K关注 0票数 3

在windows窗体应用程序中,我的背景有一个随机颜色。现在我想展示一个标签。

但是,当随机颜色是白色,标签也是,那么标签是不可见的。

我怎样才能得到完美的颜色--在我的背景色上是可见的(我的背景颜色是来自System.Drawing.Color的随机颜色)

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-05-26 09:19:56

有多种方法来确保适当的对比。

选项1:我通常坚持保留文本的黑色或白色,这取决于背景色的亮度。

要获得亮度,只需使用内置函数Color.GetBrightness()即可。

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

相反,这个微小的函数将有助于:

代码语言:javascript
复制
float getBrightness(Color c) 
{  return (c.R * 0.299f + c.G * 0.587f + c.B *0.114f) / 256f; }

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

代码语言:javascript
复制
Label lbl = new Label();
lbl.BackColor = colors[rnd.Next(colors.Count)];
lbl.ForeColor = getBrightness(lbl.BackColor) < 0.55 ? Color.White : Color.Black;

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

代码语言:javascript
复制
List<Color> colors = ((KnownColor[])Enum.GetValues(typeof(KnownColor))).
                     Select(x => Color.FromKnownColor(x)).ToList();

选项二:如果你想在前景中得到颜色,你可以随机选择它并重复,直到你通过比较得到一个像样的对比。

代码语言:javascript
复制
while (Math.Abs(c1.GetBrightness() - c2.GetBrightness()) < 0.5f ) 
            c2 = colors[rnd.Next(colors.Count)];

请注意,您不能将epsilon值推高,否则它将找不到合适的颜色。这是发生时,试图找到一个颜色,是太远的中等亮度!您可以添加一个计数器,过一段时间后只需选择黑色或白色。

选项三:还有一种方法是用Color.FromArgb()构造颜色。

你可以从倒置每个通道开始,这会给出很好的颜色对比;但如果颜色是中等亮度和/或饱和度,你将不得不纠正,也许再次选择黑色或白色。

注意:对于上面的图像,我已经列举了所有的KnownColors,这看起来已经很随意了。

要添加某种顺序,您可以根据颜色属性,例如色调,然后根据亮度对列表进行排序:

代码语言:javascript
复制
List<Color> allcolors = ((KnownColor[])Enum.GetValues(typeof(KnownColor)))
    .Select(x => Color.FromKnownColor(x))
    .OrderBy(x => x.GetHue()).ThenBy(x => getBrightness(x)).ToList();
票数 10
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50540301

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档