题
这应该是一个简单的问题,但是我还没有能够找到一种方法,使它的工作。
基本上,我有一个愚蠢的"localhost"页面,我利用在我webdevelopment.当我冲浪之间我们的发展服务器和我的当地版本的C#代码(重新定向从开发的url通过主文件)我已经知道有时会忘记什么'dev.foo.com'点在地方或服务器。
所以我创建了一个网页,其中将运行在当地为我的默认网页的默认页,因此我可以很容易地确定我localhost从服务器。
这一页不会了很多东西随机(包括生成一个人物的起始统计数据,用于D&D),包括设置一个随机的背景的颜色。我这样做是通过产生3个随机数字在0和255,并设定他们作为RGB值体背景的颜色在CSS。
鉴于3int R、G和B、如何确定R2、G2、和B2的第二颜色会有高对比,与第一个?我喜欢有的页面具有随机的背景的颜色(这让我越来越习惯于看着陆页)但我也喜欢能够阅读的文本。
解决方案
你需要一个亮度差文本的可读,以色彩的视觉本身具有过低分辨率。
所以作为一种算法,我会建议如下:
随机挑选一个的背景的颜色。
然后决定它是否是一个灯,或一个黑暗的颜色。例如,你可以检查是否平均三个主要的颜色是大于或等于128.
光的颜色使用黑色的文本,对于一个黑暗的一个白色的文本。
其他提示
"对比度"是一个加载的单词。如果您只关心能够阅读文本,那么一种简单的方法是在基于亮度的色彩空间(如HSL)中工作,并选择亮度差异较大的前景色和背景色。
HSL和RGB之间的转换是众所周知的 - 详见维基百科。
如果你在谈论实际的色彩对比度,它就不会像切割和干燥一样(据我所知,有许多感知因素没有被缩减为单一颜色空间),但我怀疑你不需要那种复杂程度。
查看此PHP解决方案:使用PHP计算颜色对比度作者:Andreas Gohr。当然,它可以移植到任何语言。
他还有一个非常好的对比分析仪演示,你可以找到一些最小的对比度水平。
您可以在 Color
类上使用方法 GetBrightness()
。它返回从0.0(黑色亮度)到1.0(白色)的浮点值。
一个简单的解决方案是:
var color1 = new Color.FromArgb(r1, g1, b1);
var brightness = color1.GetBrightness();
var color2 = brightness > 0.5 ? Color.Black : Color.White;
我在Palm OS应用程序中做了类似的事情。这就是我提出的。它没有给你“高对比度”。颜色,但它给你一个与文字颜色不同的背景颜色,以便可读:
// Black background is a special case. It's fairly likely to occur and
// the default color shift we do isn't very noticeable with very dark colors.
if (backColor.r < 0x20 && backColor.g < 0x20 && backColor.b < 0x20)
{
textColor.r = backColor.r + 0x20;
textColor.g = backColor.g + 0x20;
textColor.b = backColor.b + 0x20;
}
else
{
textColor.r = backColor.r + ((backColor.r < 128) ? 0x10 : -0x10);
textColor.g = backColor.g + ((backColor.g < 128) ? 0x10 : -0x10);
textColor.b = backColor.b + ((backColor.b < 128) ? 0x10 : -0x10);
}
您可能不需要将黑色作为特殊情况用于您的目的 - Palm的颜色处理有点时髦(16位颜色)。
这些答案或多或少建议根据颜色是亮还是暗来使用两种或三种颜色中的一种。
我使用了一种不同的方法,它在我的情况下优雅地工作。这是实施。
int color = your_color;
contrastColor = Color.rgb(255-(color >> 16)&0xFF, 255-(color >> 8)&0xFF, 255- color&0xFF);
简单而精彩。
如果翻转所有位,您将得到“相反”位。颜色对比度会很好。
我相信它是C#中的〜运算符:
R2 = ~R1;
G2 = ~G1;
B2 = ~B1;
为获得最佳对比度,请使用此代码
function lumdiff($R1,$G1,$B1,$R2,$G2,$B2){
$L1 = 0.2126 * pow($R1/255, 2.2) +
0.7152 * pow($G1/255, 2.2) +
0.0722 * pow($B1/255, 2.2);
$L2 = 0.2126 * pow($R2/255, 2.2) +
0.7152 * pow($G2/255, 2.2) +
0.0722 * pow($B2/255, 2.2);
if($L1 > $L2){
return ($L1+0.05) / ($L2+0.05);
}else{
return ($L2+0.05) / ($L1+0.05);
}
}
function get_the_contrast($c1, $c2) {
return (lumdiff(hexdec(substr($c1,0,2)),
hexdec(substr($c1,2,2)),hexdec(substr($c1,4,2)),
hexdec(substr($c2,0,2)),hexdec(substr($c2,2,2)),
hexdec(substr($c2,4,2))));
}
上述方法(AVG(红色,绿色,蓝色)&gt; 128)不太好。
private Color GetContrastingColor(Color color)
{
int r = color.R > 0 ? 256 - color.R : 255;
int g = color.G > 0 ? 256 - color.G : 255;
int b = color.B > 0 ? 256 - color.B : 255;
return System.Drawing.Color.FromArgb(r, g, b);
}
感谢 @starblue !
这是我使用的 C#
代码
public static string GetContrastBlackOrWhiteColorAsHtmlColorCode(Color c)
{
System.Drawing.Color color = System.Drawing.ColorTranslator.FromHtml("transparent");
try
{
if (c.R >= 128 && c.G >= 128 && c.B >= 128)
{
return System.Drawing.ColorTranslator.ToHtml(Color.Black);
}
else
{
return System.Drawing.ColorTranslator.ToHtml(Color.White);
}
}
catch (Exception)
{
}
return System.Drawing.ColorTranslator.ToHtml(color);
}