1 #Region "Microsoft.VisualBasic::45855f7d800a11f96a3687251100b5fa, Microsoft.VisualBasic.Core\Extensions\Image\Colors\HSLColor.vb"
2
3     ' Author:
4     
5     '       asuka (amethyst.asuka@gcmodeller.org)
6     '       xie (genetics@smrucc.org)
7     '       xieguigang (xie.guigang@live.com)
8     
9     ' Copyright (c) 2018 GPL3 Licensed
10     
11     
12     ' GNU GENERAL PUBLIC LICENSE (GPL3)
13     
14     
15     ' This program is free software: you can redistribute it and/or modify
16     ' it under the terms of the GNU General Public License as published by
17     ' the Free Software Foundation, either version 3 of the License, or
18     ' (at your option) any later version.
19     
20     ' This program is distributed in the hope that it will be useful,
21     ' but WITHOUT ANY WARRANTY; without even the implied warranty of
22     ' MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
23     ' GNU General Public License for more details.
24     
25     ' You should have received a copy of the GNU General Public License
26     ' along with this program. If not, see <http://www.gnu.org/licenses/>.
27
28
29
30     ' /********************************************************************************/
31
32     ' Summaries:
33
34     '     Structure HSLColor
35     
36     '         Properties: H, L, S
37     
38     '         Constructor: (+1 OverloadsSub New
39     '         FunctionGetHSL, hue2rgb, Lighten, ToRGB, ToString
40     
41     
42     ' /********************************************************************************/
43
44 #End Region
45
46 Imports System.Drawing
47 Imports Microsoft.VisualBasic.CommandLine.Reflection
48 Imports sys = System.Math
49
50 Namespace Imaging
51
52     ''' <summary>
53     ''' Describes a RGB color in Hue, Saturation, and Luminance values.
54     ''' </summary>
55     ''' <remarks></remarks>
56     Public Structure HSLColor
57
58         ''' <summary>
59         ''' The color hue.
60         ''' </summary>
61         ''' <remarks></remarks>
62         Public Property H As Double
63         ''' <summary>
64         ''' The color saturation.
65         ''' </summary>
66         ''' <remarks></remarks>
67         Public Property S As Double
68         ''' <summary>
69         ''' The color luminance.
70         ''' </summary>
71         ''' <remarks></remarks>
72         Public Property L As Double
73
74         Public Sub New(hValue As Double, sValue As Double, lValue As Double)
75             H = hValue
76             S = sValue
77             L = lValue
78         End Sub
79
80         Public Overrides Function ToString() As String
81             Return ToRGB.ToHtmlColor
82         End Function
83
84         ''' <summary>
85         ''' Lighten target color composition.
86         ''' </summary>
87         ''' <param name="percentage"></param>
88         ''' <param name="lightColor"></param>
89         ''' <returns></returns>
90         Public Function Lighten(percentage As Double, lightColor As Color) As Color
91             Dim base As Color = ToRGB()
92             Dim newColor As Color = Color.FromArgb(
93                 base.A,
94                 (lightColor.R / 255.0) * base.R,
95                 (lightColor.G / 255.0) * base.G,
96                 (lightColor.B / 255.0) * base.B)
97             Dim hsl As HSLColor = HSLColor.GetHSL(newColor)
98             Dim l = sys.Min(hsl.L + percentage, 1)
99
100             newColor = New HSLColor(hsl.H, hsl.S, l).ToRGB
101             Return newColor
102         End Function
103
104         Public Function ToRGB() As Color
105             Dim r, g, b As Double
106             Dim h As Double = Me.H
107             Dim s As Double = Me.S
108             Dim l As Double = Me.L
109
110             If s = 0 Then
111                 b = l
112                 g = b
113                 r = g
114             Else
115                 Dim q As Double = If(l < 0.5, l * (1 + s), l + s - l * s)
116                 Dim p As Double = 2.0 * l - q
117
118                 r = HSLColor.hue2rgb(p, q, h + 1 / 3.0)
119                 g = HSLColor.hue2rgb(p, q, h)
120                 b = HSLColor.hue2rgb(p, q, h - 1 / 3.0)
121             End If
122
123             r = r * 255.0
124             g = g * 255.0
125             b = b * 255.0
126
127             Return Color.FromArgb(r, g, b)
128         End Function
129
130         Private Shared Function hue2rgb(p As Double, q As Double, t As DoubleAs Double
131             If t < 0 Then t += 1
132             If t > 1 Then t -= 1
133             If t < 1 / 6.0 Then Return p + (q - p) * 6.0 * t
134             If t < 1 / 2.0 Then Return q
135             If t < 2 / 3.0 Then Return p + (q - p) * (2.0 / 3.0 - t) * 6.0
136             Return p
137         End Function
138
139         ''' <summary>
140         ''' Converts a RGB color into its Hue, Saturation, and Luminance (HSL) values.
141         ''' </summary>
142         ''' <param name="rgb">The color to convert.</param>
143         ''' <returns>The HSL representation of the color.</returns>
144         ''' <remarks>
145         ''' Source algorithm found using web search at:
146         ''' http://geekymonkey.com/Programming/CSharp/RGB2HSL_HSL2RGB.htm This link is external to TechNet Wiki. It will open in a new window.
147         ''' (Adapted to VB)
148         ''' </remarks>
149         ''' 
150         <ExportAPI("Color.HSL")>
151         Public Shared Function GetHSL(rgb As Color) As HSLColor
152             Dim h, s, l As Double
153             Dim r As Double = rgb.R / 255.0
154             Dim g As Double = rgb.G / 255.0
155             Dim b As Double = rgb.B / 255.0
156             Dim max, min As Double
157
158             max = sys.Max(r, g)
159             max = sys.Max(max, b)
160             min = sys.Min(r, g)
161             min = sys.Min(min, b)
162
163             l = (min + max) / 2.0
164
165             If max = min Then
166                 s = 0
167                 h = s
168             Else
169                 Dim d As Double = max - min
170
171                 s = If(l > 0.5, d / (2.0 - max - min), d / (max + min))
172
173                 If max = r Then
174                     h = (g - b) / d + (If(g < b, 6.0, 0.0))
175                 ElseIf max = g Then
176                     h = (b - r) / d + 2.0
177                 ElseIf max = b Then
178                     h = (r - g) / d + 4.0
179                 End If
180
181                 h /= 6.0
182             End If
183
184             Return New HSLColor(h, s, l)
185         End Function
186     End Structure
187 End Namespace