这是我之前在 Game Development Stack Exchange 上对基本相同问题的回答。
总而言之,就像这里建议的其他答案一样,您通常应该使用black或white,具体取决于哪一个与背景形成更好的对比。(当然,如果你愿意,给任何一种颜色加上轻微的色调不会对对比度产生太大影响。)
请注意,为了正确确定颜色对用户的显示程度,仅平均 RGB 颜色值(或取 HSL / HSV 颜色的亮度/值)是不够的。相反,您需要考虑(至少)两个影响:
显示颜色的设备的非线性,这(至少对于计算机屏幕上的 RGB 颜色)往往会使中间色调变暗,并且
人眼的光谱敏感性,粗略地说,这会导致可见光谱中间附近的颜色(绿色、黄色、青色)看起来比边缘附近的颜色(蓝色、红色、紫色)更亮。
第一个问题可以通过伽马扩展来解决,而第二个问题只需要对 R/G/B 颜色通道进行非均匀加权。综上所述,以下是如何近似计算 RGB 颜色的感知亮度,并确定黑色或白色是否会更好地与之形成对比:
const float gamma = 2.2;
float L = 0.2126 * pow( R, gamma )
+ 0.7152 * pow( G, gamma )
+ 0.0722 * pow( B, gamma );
boolean use_black = ( L > 0.5 );
假设R和是 0.0 到 1.0G之间B的浮点数。如果您有例如 0 到 255 的整数,请将它们转换为浮点数并除以 255。
上面代码中的常量(大约)对于sRGB输入是正确的;如果您在其他颜色空间中工作,则可以调整它们,尽管确切的值并不那么重要:对于足够深或足够浅的颜色,答案无论如何都是一样的,而落在边界线附近的颜色会形成对比无论如何,黑色或白色都差不多。