2013-03-08 45 views
3

鉴于HSV或RGB,是否有一种算法可以为背景保留随机颜色,保证纯白色字体的可读性?生成可以在白色字体上轻松读取的颜色的算法?

虽然我使用C#,但它不一定是语言特定的实现。

感谢

我做了这一点,但我相信它可以改进:

public static System.Drawing.Color GenerateRandomLiteColor() 
     { 
      var rnd = new Random(DateTime.Now.Millisecond); 
      double mul = 240.0; 
      HSLColor c = new HSLColor(rnd.NextDouble() * mul, 
       ((rnd.NextDouble() * 0.6) + 0.5) * mul, ((rnd.NextDouble() * 0.35) + 0.5) * mul); 

      string s = c.ToRGBString(); 
      return c; 
     } 
+1

黑色,黑色,黑色,黑色,...;那是随机的吗? – 2013-03-08 16:49:57

+0

我希望不会有这样的愚蠢回应。显然这有点主观......但在理由... – user2043533 2013-03-08 16:50:53

+0

保证?这有点主观。一个人的可读性是另一个人不可读的。另外,你需要更具体。我可以选择2个不同的深色值,并从这2个中随机挑选并满足您目前的问题。 – hatchet 2013-03-08 16:52:08

回答

2

使用HSL你可以说为L低于一定值什么是可见的,它有足够的黑暗足够对比。但这是一个主观价值。你可以让H和S随机。 HSL可以转换为HSV或RGB。

L不应该是随机的。或者它可能会在您预先定义的范围内,以提供足够的对比。即低于固定的Lmax。

1

对于RGB有其计算颜色的亮度的公式:

0.299 * R + 0.587 * G + 0.114 * B

正如所看到的,每个R,G,的B颜色有其自己的亮度系数。 要在白色背景上生成可读的字体,请生成完全随机的颜色。然后检查其亮度是否小于某个预定义的常数C。如果超过Ç和等于一些d> c^,然后通过C/d乘以每个R,G,B值的使亮度等于Ç

+1

而不是乘以'C/D',乘以一个从0到'C/D'。否则,你的发行将倾向于较轻的颜色。 – 2013-03-08 18:52:42

+0

是的,你完全正确。 – aram90 2013-03-09 08:19:35

+0

我想到了一个更好的方法,我们应该用** D **来表示白色的亮度,因此我们通过上面的公式得到** D = 255 **。然后,每种颜色应该乘以** C/D **而不检查任何条件。 – aram90 2013-03-09 08:21:59