-
This commit is contained in:
141
vbnet/HSLColor.vb
Normal file
141
vbnet/HSLColor.vb
Normal file
@@ -0,0 +1,141 @@
|
||||
Public Structure HSLColor
|
||||
Public Sub New(color As Color)
|
||||
SetRGB(color.R, color.G, color.B)
|
||||
End Sub
|
||||
|
||||
Public Sub New(h As Integer, s As Integer, l As Integer)
|
||||
Hue = h
|
||||
Saturation = s
|
||||
Luminosity = l
|
||||
End Sub
|
||||
|
||||
Private HueValue As Double
|
||||
|
||||
Property Hue As Integer
|
||||
Get
|
||||
Return CInt(HueValue * 240)
|
||||
End Get
|
||||
Set(value As Integer)
|
||||
HueValue = CheckRange(value / 240)
|
||||
End Set
|
||||
End Property
|
||||
|
||||
Private SaturationValue As Double
|
||||
|
||||
Property Saturation As Integer
|
||||
Get
|
||||
Return CInt(SaturationValue * 240)
|
||||
End Get
|
||||
Set(value As Integer)
|
||||
SaturationValue = CheckRange(value / 240)
|
||||
End Set
|
||||
End Property
|
||||
|
||||
Private LuminosityValue As Double
|
||||
|
||||
Property Luminosity As Integer
|
||||
Get
|
||||
Return CInt(LuminosityValue * 240)
|
||||
End Get
|
||||
Set(value As Integer)
|
||||
LuminosityValue = CheckRange(value / 240)
|
||||
End Set
|
||||
End Property
|
||||
|
||||
Private Function CheckRange(value As Double) As Double
|
||||
If value < 0 Then
|
||||
value = 0
|
||||
ElseIf value > 1 Then
|
||||
value = 1
|
||||
End If
|
||||
|
||||
Return value
|
||||
End Function
|
||||
|
||||
Function ToColorAddLuminosity(luminosity As Integer) As Color
|
||||
Me.Luminosity += luminosity
|
||||
Return ToColor()
|
||||
End Function
|
||||
|
||||
Function ToColorSetLuminosity(luminosity As Integer) As Color
|
||||
Me.Luminosity = luminosity
|
||||
Return ToColor()
|
||||
End Function
|
||||
|
||||
Function ToColor() As Color
|
||||
Dim r, g, b As Double
|
||||
|
||||
If LuminosityValue <> 0 Then
|
||||
If SaturationValue = 0 Then
|
||||
b = LuminosityValue
|
||||
g = LuminosityValue
|
||||
r = LuminosityValue
|
||||
Else
|
||||
Dim temp2 = GetTemp2(Me)
|
||||
Dim temp1 = 2.0 * LuminosityValue - temp2
|
||||
|
||||
r = GetColorComponent(temp1, temp2, HueValue + 1.0 / 3.0)
|
||||
g = GetColorComponent(temp1, temp2, HueValue)
|
||||
b = GetColorComponent(temp1, temp2, HueValue - 1.0 / 3.0)
|
||||
End If
|
||||
End If
|
||||
|
||||
Return Color.FromArgb(CInt(255 * r), CInt(255 * g), CInt(255 * b))
|
||||
End Function
|
||||
|
||||
Private Shared Function GetColorComponent(temp1 As Double,
|
||||
temp2 As Double,
|
||||
temp3 As Double) As Double
|
||||
temp3 = MoveIntoRange(temp3)
|
||||
|
||||
If temp3 < 1 / 6 Then
|
||||
Return temp1 + (temp2 - temp1) * 6.0 * temp3
|
||||
ElseIf temp3 < 0.5 Then
|
||||
Return temp2
|
||||
ElseIf temp3 < 2 / 3 Then
|
||||
Return temp1 + ((temp2 - temp1) * ((2 / 3) - temp3) * 6)
|
||||
Else
|
||||
Return temp1
|
||||
End If
|
||||
End Function
|
||||
|
||||
Private Shared Function MoveIntoRange(temp3 As Double) As Double
|
||||
If temp3 < 0 Then
|
||||
temp3 += 1
|
||||
ElseIf temp3 > 1 Then
|
||||
temp3 -= 1
|
||||
End If
|
||||
|
||||
Return temp3
|
||||
End Function
|
||||
|
||||
Private Shared Function GetTemp2(hslColor As HSLColor) As Double
|
||||
Dim temp2 As Double
|
||||
|
||||
If hslColor.LuminosityValue < 0.5 Then
|
||||
temp2 = hslColor.LuminosityValue * (1.0 + hslColor.SaturationValue)
|
||||
Else
|
||||
temp2 = hslColor.LuminosityValue + hslColor.SaturationValue - (hslColor.LuminosityValue * hslColor.SaturationValue)
|
||||
End If
|
||||
|
||||
Return temp2
|
||||
End Function
|
||||
|
||||
Public Shared Function Convert(c As Color) As HSLColor
|
||||
Dim r As New HSLColor()
|
||||
|
||||
r.HueValue = c.GetHue() / 360.0
|
||||
r.LuminosityValue = c.GetBrightness()
|
||||
r.SaturationValue = c.GetSaturation()
|
||||
|
||||
Return r
|
||||
End Function
|
||||
|
||||
Public Sub SetRGB(red As Integer, green As Integer, blue As Integer)
|
||||
Dim hc = HSLColor.Convert(Color.FromArgb(red, green, blue))
|
||||
|
||||
HueValue = hc.HueValue
|
||||
SaturationValue = hc.SaturationValue
|
||||
LuminosityValue = hc.LuminosityValue
|
||||
End Sub
|
||||
End Structure
|
||||
Reference in New Issue
Block a user