找出十六进制颜色是深还是浅

sam*_*360 4 c#-4.0 asp.net-mvc-4

使用 C# 我想找出十六进制颜色(网络格式,例如:#FF2233)是深还是浅,我可以根据它来决定前景色(字体颜色)应该是什么。

应用程序的用户选择颜色作为某些元素的背景。然后程序需要确定用户的背景颜色是否为暗色,然后选择白色作为字体颜色(以获得最佳可读性和对比度),否则选择黑色。

到目前为止,我一直在尝试计算“F”、“E”、“C”、“D”、“B”和“A”出现的次数。如果至少出现 4 次,我认为颜色很亮。它在大约 70% 的时间内有效。

有没有更好的解决方案?

小智 8

如果你将你的十六进制颜色转换为 rgb格式,那么如果它结束 ((255*3)/2) 它是深色,否则它是浅色

        System.Drawing.Color col = System.Drawing.ColorTranslator.FromHtml("#FF2233");
        if (col.R * 0.2126 + col.G * 0.7152 + col.B * 0.0722 > 255 / 2)
        {
            //dark color
        }
        else
        {
            //light color
        }
Run Code Online (Sandbox Code Playgroud)

编辑:更新亮度,感谢@Jon 的想法

  • 我认为条件是相反的,如果数字大于127.5则为亮,小于则可以认为为暗。 (2认同)

Jon*_*Jon 6

从 RGB 分量计算颜色的亮度非常简单。如果从人类的角度来看,这不会给出地球上最准确的结果,但它会比其他幼稚的尝试要好得多。

给定颜色分量 R、G、B 的值,亮度 Y 为

Y = 0.2126 R + 0.7152 G + 0.0722 B
Run Code Online (Sandbox Code Playgroud)

然后,您将为 Y 选择一个任意阈值,将“深色”与“浅色”分开。