恰巧我不久前的一个项目需要这个功能。
private int PerceivedBrightness(Color c)
{
return (int)Math.Sqrt(
c.R * c.R * .241 +
c.G * c.G * .691 +
c.B * c.B * .068);
}
这个公式是我在网上找到的Nbd Tech http://www.nbdtech.com/Blog/archive/2008/04/27/Calculating-the-Perceived-Brightness-of-a-Color.aspx涉及感知颜色和颜色转换公式。该网站提供了大量有用的信息。
以下是如何使用它来选择黑色或白色:
var foreColor = (PerceivedBrightness(backColor) > 130 ? Color.Black : Color.White);
您可以使用 130 以外的值作为截止值;这是偏好。
Update:根据达雷尔·雷克斯·芬利 (Darel Rex Finley) 的说法his site http://alienryderflex.com/hsp.html:
我通过 Photoshop 得出的值实际上是 0.241、0.691 和 0.068,但后来我得知值 0.299、0.587 和 0.114 更准确。
本规范如下ITU-R 建议书 BT.601 http://en.wikipedia.org/wiki/CCIR_601(或简称为Rec. 601)。我上面提到的网站,Nbd Tech http://www.nbdtech.com/Blog/archive/2008/04/27/Calculating-the-Perceived-Brightness-of-a-Color.aspx,尚未更新以反映这一点。
在此基础上,这里是更新的方法(感谢 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);
}
关于阈值偏好的注意事项:
感知亮度接近中间(例如 120-140)的颜色会更加主观。例如,评估值为 139 的红色 (FF0000) 在黑色或白色覆盖层上是否更清晰是有争议的。