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