2014-02-07 3 views
-4

vb.net에서 빨간색 (값 0)에서 녹색 (값 100)으로 색상을 반환하는 함수가 필요합니다. 또한 배경색에 따라 글꼴의 색이 흰색 또는 검정색인지 확인하는 방법이 필요합니다.값에 따라 녹색에서 빨간색으로

+2

당신은 지금까지 해 온 것을 보여줍니다. 이것은 코드 팩토리가 아닙니다. 그렇게 말하면서, 당신이 찾고있는 것은'XNA' [Color.Lerp] (http://msdn.microsoft.com/en-us/library/microsoft.xna.framework.graphics.color)와 같은 것입니다. lerp (v = xnagamestudio.31) .aspx) 방법. –

답변

2

선형 보간

나는 한번의 WinForm에 linearly interpolation 둘 사이의 색상을 할 수있는 같은 요구를했다. 나는 OP만이 아니라 다른 사람들에게도 유용 할 거라고 생각하면서 예외를 만들고 이것을 배후에서 공유 할 것이다.

함수 범위 0.0(0 %)의 값을 받아 Single(100 %)1.0한다.

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 
+0

또 다른 방법은,이 방법보다 더 나쁜 것은'Drawing2D.LinearGradientBrush'를 사용하여 그것을 비트 맵으로 변환하고'GetPixel' 메소드를 사용하는 것입니다. 이 기능을 알면이 방법을 사용하는 것은 터무니 없습니다. – Nizam