从绿色到红色取决于值

时间:2014-02-07 06:17:14

标签: vb.net winforms

我需要一个在vb.net中将颜色从红色(值0)返回到绿色(值100)的函数。另外,我需要一种方法来发现字体的颜色应该是白色还是黑色,具体取决于背景颜色。

1 个答案:

答案 0 :(得分:2)

线性插值

我曾经有同样的需要在winform中的两种颜色之间做linearly interpolation。我将做一个例外并分享这背后的代码,因为我认为它不仅对OP而且对其他人有用。

该函数接受Single (0%)范围内的0.0值到1.0 (100%)

Public Shared Function Lerp(ByVal color1 As Color, ByVal color2 As Color, ByVal amount As Single) As Color
    Const bitmask As Single = 65536.0!
    Dim n As UInteger = CUInt(Math.Round(CDbl(Math.Max(Math.Min((amount * bitmask), bitmask), 0.0!))))
    Dim r As Integer = (CInt(color1.R) + (((CInt(color2.R) - CInt(color1.R)) * CInt(n)) >> 16))
    Dim g As Integer = (CInt(color1.G) + (((CInt(color2.G) - CInt(color1.G)) * CInt(n)) >> 16))
    Dim b As Integer = (CInt(color1.B) + (((CInt(color2.B) - CInt(color1.B)) * CInt(n)) >> 16))
    Dim a As Integer = (CInt(color1.A) + (((CInt(color2.A) - CInt(color1.A)) * CInt(n)) >> 16))
    Return Color.FromArgb(a, r, g, b)
End Function

所以在你的情况下它看起来像这样:

Dim value As Integer = 'A value in the range 0 - 100
Dim newColor As Color = Lerp(Color.Red, Color.Green, If((value > 0I), (Math.Min(Math.Max(CSng(value), 0.0!), 100.0!) / 100.0!), 0.0!))

<强>光度

关于部件“白色或黑色,取决于背景”,您需要知道颜色的亮度。以下函数返回0表示黑色,240表示白色。因此,如果给定背景的亮度为<= 120,则应使用白色前景。

Public Shared Function GetLuminosity(c As Color) As Integer
    Return CInt((((Math.Max(Math.Max(CInt(c.R), CInt(c.G)), CInt(c.B)) + Math.Min(Math.Min(CInt(c.R), CInt(c.G)), CInt(c.B))) * 240) + 255) / 510I)   
End Function