HSVtoRGB


Description:
These two functions can convert to and from RGB and HSV values. Note that the max value for any of the RGB units is 255, where as the max value for any of the HSV units is 240.
 
Code:
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
 
Sample Usage:
 
    Dim hsvColor As typeHSV
    Dim rgbColor As typeRGB

    hsvColor.Hue = 0
    hsvColor.Sat = 240
    hsvColor.Val = 120

    HSVToRGB hsvColor, rgbColor