根据背景使前景色为黑色或白色

Kai*_*Kai 34 c# colors

比如计算rgb组件的平均值然后决定是使用黑色还是白色?

我是否必须在第一步将RGB转换为HSV,因为RGB并不总是人眼看到的?

我正在使用C#

JYe*_*ton 68

事实上,我不久前需要为一个项目提供这个功能.

private int PerceivedBrightness(Color c)
{
    return (int)Math.Sqrt(
    c.R * c.R * .241 +
    c.G * c.G * .691 +
    c.B * c.B * .068);
}
Run Code Online (Sandbox Code Playgroud)

我在Nbd Tech网站上发现了这个公式,它涉及感知颜色和颜色转换公式.该网站提供了许多有用的信息.

以下是如何使用它来选择黑色或白色:

var foreColor = (PerceivedBrightness(backColor) > 130 ? Color.Black : Color.White);
Run Code Online (Sandbox Code Playgroud)

您可以使用130以外的值作为截止值; 这是偏好.


更新:据Darel Rex Finley在他的网站上说:

我通过玩Photoshop得到的值实际上是.241,.691和.068,但我已经被告知值.299,.587和.114更准确.

本规范遵循ITU-R建议书BT.601(或简称601).我在上面提到的网站Nbd Tech尚未更新以反映这一点.

基于此,这是更新的方法(感谢DTI-Matt的评论):

private int PerceivedBrightness(Color c)
{
    return (int)Math.Sqrt(
    c.R * c.R * .299 +
    c.G * c.G * .587 +
    c.B * c.B * .114);
}
Run Code Online (Sandbox Code Playgroud)

关于阈值偏好的说明:

在中间附近具有感知亮度的颜色(例如120-140)将更主观.例如,评估为139的红色(FF0000)是否更清晰,黑色或白色覆盖是否有争议.

白色和黑色红色

  • **注意:**这些值的来源已更新:http://alienryderflex.com/hsp.html它们现在显示为:`R:.299``G:.587``B:.114` (3认同)

Kai*_*Kai 6

那个怎么样?

private static Color GetReadableForeColor(Color c)
{
    return (((c.R + c.B + c.G) / 3) > 128) ? Color.Black : Color.White;
}
Run Code Online (Sandbox Code Playgroud)

  • 请尝试使用以下值:128,255,0.它是浅绿色,在黑色背景下更容易阅读.但是,平均值为127,您的方法将返回白色. (3认同)

Ron*_*lic 5

Color结构支持本地转换为HSB.

if (Color.GetBrightness() > 0.5f) {
  // win
}
Run Code Online (Sandbox Code Playgroud)

您可能还想添加饱和度分量,考虑到饱和度也会导致明显的"亮度".