Vb.net 根据值从绿色变为红色

Vb.net 根据值从绿色变为红色,vb.net,winforms,Vb.net,Winforms,我需要一个函数,该函数在vb.net中返回从红色值0到绿色值100的颜色。我还需要一种方法来发现字体的颜色应该是白色还是黑色,这取决于背景色 线性插值 我曾经有过同样的需求,需要在winform中的两种颜色之间进行线性插值。我将做一个例外,并分享背后的代码,因为我认为它可能不仅对OP有用,而且对其他人也有用 该函数接受0.0%到1.0%范围内的单个值 因此,在您的情况下,它将如下所示: Dim value As Integer = 'A value in the range 0 - 100 Di

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

线性插值

我曾经有过同样的需求,需要在winform中的两种颜色之间进行线性插值。我将做一个例外,并分享背后的代码,因为我认为它可能不仅对OP有用,而且对其他人也有用

该函数接受0.0%到1.0%范围内的单个值

因此,在您的情况下,它将如下所示:

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表示白色。所以,如果给定背景色的亮度是你知道的,告诉我们你到目前为止做了什么。这不是代码工厂。话虽如此,您所寻找的是类似XNA方法的东西。另一种方法,当然比这更糟糕,是使用Drawing2D.LinearGradientBrush,将其转换为位图,然后使用GetPixel方法。知道了这个函数,用这种方法是很荒谬的。。。
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!))
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