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)是否更清晰,黑色或白色覆盖是否有争议.
那个怎么样?
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)
该Color结构支持本地转换为HSB.
if (Color.GetBrightness() > 0.5f) {
// win
}
Run Code Online (Sandbox Code Playgroud)
您可能还想添加饱和度分量,考虑到饱和度也会导致明显的"亮度".