根据背景制作前景色黑色或白色
那是什么?
private static Color GetReadableForeColor(Color c)
{
return (((c.R + c.B + c.G)/3) > 128) ? Color.Black : Color.White;
}
尝试使用以下值: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";
如果颜色的下方,这是黑暗的......使用白色背景。如果它在上面,它更轻...使用黑色背景。这不是完美的,而是一个开始的想法。
我在我的项目中尝试过类似的东西,结果在某些情况下白/黑色标签在背景颜色上并不显眼。 – 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)是否更清晰,具有黑色或白色覆盖层,这是值得商榷的。
这基本上是用于亮度的公式,平方值给异常值更多的权重。结果是0-255的比例。 http://en.wikipedia.org/wiki/Luma_%28video%29 – 2010-02-11 01:12:42
**注意:**这些值的来源已更新:http://alienryderflex.com/hsp.html 现在显示它们如:'R:.299''G:.587''B:.114' – 2014-06-06 16:15:35
@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一个等),以节省时间。更一般地说,这似乎是一件相当不体面的事情。在运行时拉取用户文件并对其进行处理并不容易,它提供了潜在的安全性和稳定性问题。如果图像是达夫或腐败等。
我个人建议简单地给用户选择颜色/主题/皮肤本身,或更好的让他们定制它!
我不想更改整个应用程序的颜色。我使用了一个listview,其中的项目有bg颜色,每个项目的文本应该可读... – Kai 2010-02-11 00:55:40
Color
struct支持本地转换为HSB。
if (Color.GetBrightness() > 0.5f) {
// win
}
您可能还想添加一个饱和度分量,考虑到饱和度也会导致明显的“亮度”。
这个问题包含的答案将帮助你:http://stackoverflow.com/questions/946544/good-text-foreground-color-for-a-given-background-color/946570 – 2010-02-11 00:42:31
相关(但欺骗本身) :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