| Option Explicit
Type typeHSV
Hue As Single
Sat As Single
Val As Single
End Type
Type typeRGB
Red As Single
Blue As Single
Green As Single
End Type
Public Sub HSVToRGB(hsvColor As typeHSV, rgb As typeRGB)
Dim rgbTemp As typeRGB
Dim hsvTemp As typeHSV
Dim nMin As Single
Dim nMax As Single
Debug.Assert hsvColor.Hue >= 0
Debug.Assert hsvColor.Hue <= 240
Debug.Assert hsvColor.Sat >= 0
Debug.Assert hsvColor.Sat <= 240
Debug.Assert hsvColor.Val >= 0
Debug.Assert hsvColor.Val <= 240
hsvTemp.Sat = hsvColor.Sat / 240
hsvTemp.Val = hsvColor.Val / 240
hsvTemp.Hue = hsvColor.Hue / 40
If hsvTemp.Hue > 5 Then
hsvTemp.Hue = -(1 + (5 - hsvTemp.Hue))
End If
If hsvTemp.Sat = 0 Then
rgbTemp.Red = hsvTemp.Val
rgbTemp.Green = hsvTemp.Val
rgbTemp.Blue = hsvTemp.Val
Else
If hsvTemp.Val <= 0.5 Then
nMin = hsvTemp.Val * (1 - hsvTemp.Sat)
Else
nMin = hsvTemp.Val - hsvTemp.Sat * (1 - hsvTemp.Val)
End If
nMax = 2 * hsvTemp.Val - nMin
If (hsvTemp.Hue < 1) Then
rgbTemp.Red = nMax
If (hsvTemp.Hue < 0) Then
rgbTemp.Green = nMin
rgbTemp.Blue = rgbTemp.Green - hsvTemp.Hue * (nMax - nMin)
Else
rgbTemp.Blue = nMin
rgbTemp.Green = hsvTemp.Hue * (nMax - nMin) + rgbTemp.Blue
End If
ElseIf (hsvTemp.Hue < 3) Then
rgbTemp.Green = nMax
If (hsvTemp.Hue < 2) Then
rgbTemp.Blue = nMin
rgbTemp.Red = rgbTemp.Blue - (hsvTemp.Hue - 2) * (nMax - _
nMin)
Else
rgbTemp.Red = nMin
rgbTemp.Blue = (hsvTemp.Hue - 2) * (nMax - nMin) + _
rgbTemp.Red
End If
Else
rgbTemp.Blue = nMax
If (hsvTemp.Hue < 4) Then
rgbTemp.Red = nMin
rgbTemp.Green = rgbTemp.Red - (hsvTemp.Hue - 4) * (nMax - _
nMin)
Else
rgbTemp.Green = nMin
rgbTemp.Red = (hsvTemp.Hue - 4) * (nMax - nMin) + _
rgbTemp.Green
End If
End If
End If
rgb.Red = rgbTemp.Red * 255
rgb.Green = rgbTemp.Green * 255
rgb.Blue = rgbTemp.Blue * 255
End Sub
Public Sub RGBToHSV(rgb As typeRGB, hsvColor As typeHSV)
Dim nMax As Single
Dim nMin As Single
Dim nDelta As Single
Dim rgbTemp As typeRGB
Debug.Assert rgb.Red >= 0
Debug.Assert rgb.Red <= 255
Debug.Assert rgb.Green >= 0
Debug.Assert rgb.Green <= 255
Debug.Assert rgb.Blue >= 0
Debug.Assert rgb.Blue <= 255
rgbTemp.Red = rgb.Red / 255
rgbTemp.Green = rgb.Green / 255
rgbTemp.Blue = rgb.Blue / 255
With rgbTemp
If .Red < .Green Then
If .Blue < .Red Then
nMin = .Blue
If .Red > .Green Then
nMax = .Red
Else
nMax = .Green
End If
Else
nMin = .Red
If .Blue > .Green Then
nMax = .Blue
Else
nMax = .Green
End If
End If
Else
If .Blue < .Green Then
nMin = .Blue
If .Red > .Green Then
nMax = .Red
Else
nMax = .Green
End If
Else
nMin = .Green
If .Red > .Blue Then
nMax = .Red
Else
nMax = .Blue
End If
End If
End If
End With
hsvColor.Val = (nMax + nMin) / 2
If nMax = nMin Then
hsvColor.Sat = 0
hsvColor.Hue = 0
Else
If hsvColor.Val <= 0.5 Then
hsvColor.Sat = (nMax - nMin) / (nMax + nMin)
Else
hsvColor.Sat = (nMax - nMin) / (2 - nMax - nMin)
End If
nDelta = nMax - nMin
If rgbTemp.Red = nMax Then
hsvColor.Hue = (rgbTemp.Green - rgbTemp.Blue) / nDelta
ElseIf rgbTemp.Green = nMax Then
hsvColor.Hue = 2 + (rgbTemp.Blue - rgbTemp.Red) / nDelta
ElseIf rgbTemp.Blue = nMax Then
hsvColor.Hue = 4 + (rgbTemp.Red - rgbTemp.Green) / nDelta
End If
End If
hsvColor.Sat = hsvColor.Sat * 240
hsvColor.Val = hsvColor.Val * 240
If hsvColor.Hue < 0 Then
hsvColor.Hue = hsvColor.Hue + 6
End If
hsvColor.Hue = hsvColor.Hue * 40
End Sub
|