根据背景制作前景色黑色或白色

问题描述:

类似于计算rgb组件的平均值然后决定是使用黑色还是白色?根据背景制作前景色黑色或白色

我是否必须在第一步将RGB转换为HSV?因为RGB并不总是人眼所见?

我使用C#

+2

这个问题包含的答案将帮助你:http://stackoverflow.com/questions/946544/good-text-foreground-color-for-a-given-background-color/946570 – 2010-02-11 00:42:31

+0

相关(但欺骗本身) :http://stackoverflow.com/questions/3116260/given-a-background-color-how-to-get-a-foreground-color-that-make-it-readable-on http://stackoverflow.com/问题/ 3942878/how-to-decide-font-color-in-white-or-black-depends-on-background-color – JYelton 2011-02-07 18:06:14

那是什么?

private static Color GetReadableForeColor(Color c) 
{ 
    return (((c.R + c.B + c.G)/3) > 128) ? Color.Black : Color.White; 
} 
+1

尝试使用以下值:128,255,0。它是浅绿色,在黑色背景下更易于阅读。但是,平均值为127,您的方法将返回白色。 – JYelton 2011-05-18 16:05:06

你可以做一个简单的计算取决于颜色深度,如果说你有一个#FFFFFF颜色格式,你可以只添加的RGB值计算,如果他们中途下。

在这种情况下,最大为255(F X F = 256)左右,所以只检查它是否在该阈值:

var colorCode = ((R + B + G) < 255*3) ? "#FFFFFF" : "#000000"; 

如果颜色的下方,这是黑暗的......使用白色背景。如果它在上面,它更轻...使用黑色背景。这不是完美的,而是一个开始的想法。

+0

我在我的项目中尝试过类似的东西,结果在某些情况下白/黑色标签在背景颜色上并不显眼。 – JYelton 2010-02-11 00:42:50

恰好如此,我不久前需要这个功能。

private int PerceivedBrightness(Color c) 
{ 
    return (int)Math.Sqrt(
    c.R * c.R * .241 + 
    c.G * c.G * .691 + 
    c.B * c.B * .068); 
} 

此式I在Nbd Tech腹板与感知的颜色和颜色转换公式处理上找到。该网站提供了很多有用的信息。

下面是如何用它来选择黑色或白色:

var foreColor = (PerceivedBrightness(backColor) > 130 ? Color.Black : Color.White); 

您可以使用超过130为分界之外的值;这是首选。


更新:根据DAREL雷克斯芬利在his site

的值,我想出了通过用Photoshop打实际上是0.241,0.691和0.068,但我有自从被告知值.299,.587和.114更准确。

该规范如下ITU-R Recommendation BT.601(或简称Rec.601)。我上面提到的网站Nbd Tech尚未更新以反映此情况。

在此基础上,这里是更新的方法(感谢DTI-马特的评论)

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)是否更清晰,具有黑色或白色覆盖层,这是值得商榷的。

White and Black on Red

+0

这基本上是用于亮度的公式,平方值给异常值更多的权重。结果是0-255的比例。 http://en.wikipedia.org/wiki/Luma_%28video%29 – 2010-02-11 01:12:42

+2

**注意:**这些值的来源已更新:http://alienryderflex.com/hsp.html 现在显示它们如:'R:.299''G:.587''B:.114' – 2014-06-06 16:15:35

+0

@DTI感谢提示,我已经更新了答案。 – JYelton 2014-06-06 16:59:40

如果我理解正确的话,一个方法可能是拿到桌面墙纸图像的保持,在某些庄园它是什么颜色的检查,然后更改基于您的应用程序的颜色。

有关于得到保持当前的桌面壁纸(和大量的点击率在谷歌上)的一篇文章on geekpedia,但基本前提是要抓住当前壁纸的注册表值:

RegistryKey rkWallPaper = Registry.CurrentUser.OpenSubKey("Control Panel\\Desktop", false); 
string WallpaperPath = rkWallPaper.GetValue("WallPaper").ToString(); 

你然后可以使用该路径打开图像。然后,您可以掌握很多属性,例如RGB中的尺寸和单个像素颜色。

要弄清楚它是“更白”还是“更黑”,你有很多选择。

一个想法是获取RGB中的每个像素颜色,平均值(获取灰度值),然后平均每个像素在图像上的灰度值。如果这出来大于128,那么它可能被认为是“白色”。如果< 128那么“黑色”。基本上,您正在决定图像像素强度平均分布的中间灰色分界线的哪一侧。

// Psudo code - can't check the C# spec atm. 
foreach(Pixel p in image) 
{ 
    // get average of colour components. 
    double greyScale = (p.Red + p.Green + p.Blue)/3; 
    totalIntensity += greyScale; 
} 

double averageImageIntensity = totalIntensity/image.NumPixels; 

if(totalIntensity > 128) // image could be considered to be "white" 
else // image could be considered "black". 

问题:可能是一个缓慢的过程,你可能只想品尝一些像素的(比如,每10一个等),以节省时间。更一般地说,这似乎是一件相当不体面的事情。在运行时拉取用户文件并对其进行处理并不容易,它提供了潜在的安全性和稳定性问题。如果图像是达夫或腐败等。

我个人建议简单地给用户选择颜色/主题/皮肤本身,或更好的让他们定制它!

+0

我不想更改整个应用程序的颜色。我使用了一个listview,其中的项目有bg颜色,每个项目的文本应该可读... – Kai 2010-02-11 00:55:40

Color struct支持本地转换为HSB。

if (Color.GetBrightness() > 0.5f) { 
    // win 
} 

您可能还想添加一个饱和度分量,考虑到饱和度也会导致明显的“亮度”。