zoukankan      html  css  js  c++  java
  • RGB、HSB、HSL 互相转换算法

    引用:http://hi.baidu.com/zhjw8086/item/1fcf680d03fbb28b02ce1b45

    Public Type HSB
        Hue As Integer           
        Saturation As Integer    
        Brightness As Integer    
    End Type

    Public Type HSL
        Hue As Integer           
        Saturation As Integer    
        Luminance As Integer    
    End Type

    Public Type RGB
        Red As Integer           
        Green As Integer        
        Bue As Integer
    End Type

    ' 转换RGBHSB
    Public Function RGB2HSB(ByVal R As Integer, ByVal G As Integer, ByVal B As Integer) As HSB
        Dim nH As Single, nS As Single, nV As Single
        Dim nR As Single, nG As Single, nB As Single
        Dim ndelR As Single, ndelG As Single, ndelB As Single
        Dim nmax As Single, nmin As Single, ndelMax As Single

        nR = R / 255
        nG = G / 255
        nB = B / 255
        nmax = Max(Max(nR, nG), nB)
        nmin = Min(Min(nR, nG), nB)
        ndelMax = nmax - nmin
        nV = nmax
        If (ndelMax = 0) Then
            nH = 0
            nS = 0
        Else
            nS = ndelMax / nmax
            ndelR = (((nmax - nR) / 6) + (ndelMax / 2)) / ndelMax
            ndelG = (((nmax - nG) / 6) + (ndelMax / 2)) / ndelMax
            ndelB = (((nmax - nB) / 6) + (ndelMax / 2)) / ndelMax
            If (nR = nmax) Then
                nH = ndelB - ndelG
            ElseIf (nG = nmax) Then
                nH = (1 / 3) + ndelR - ndelB
            ElseIf (nB = nmax) Then
                nH = (2 / 3) + ndelG - ndelR
            End If
            If (nH < 0) Then nH = nH + 1
            If (nH > 1) Then nH = nH - 1
        End If
        RGB2HSB.Hue = nH * 360
        RGB2HSB.Saturation = nS * 100
        RGB2HSB.Brightness = nV * 100
        
    End Function

    ' 转换HSBRGB
    Public Function HSB2RGB(ByVal H As Integer, ByVal S As Integer, ByVal B As Integer) As RGB
        Dim nH As Single, nS As Single, nV As Single
        Dim nR As Single, nG As Single, nB As Single
        Dim hi As Single, f As Single, p As Single, q As Single, t As Single
        
        nH = H / 360
        nS = S / 100
        nV = B / 100
        If (S = 0) Then
            nR = nV * 255
            nG = nV * 255
            nB = nV * 255
        Else
            hi = nH * 6
            If (hi = 6) Then hi = 0
            f = Int(hi)
            p = nV * (1 - nS)
            q = nV * (1 - nS * (hi - f))
            t = nV * (1 - nS * (1 - (hi - f)))

            If (f = 0) Then
                nR = nV
                nG = t
                nB = p
            ElseIf (f = 1) Then
                nR = q
                nG = nV
                nB = p
            ElseIf (f = 2) Then
                nR = p
                nG = nV
                nB = t
            ElseIf (f = 3) Then
                nR = p
                nG = q
                nB = nV
            ElseIf (f = 4) Then
                nR = t
                nG = p
                nB = nV
            Else
                nR = nV
                nG = p
                nB = q
            End If
        End If
        HSB2RGB.Red = nR * 255
        HSB2RGB.Green = nG * 255
        HSB2RGB.Bue = nB * 255
        
    End Function

    ' 转换RGB到HSL
    Public Function RGB2HSL(ByVal R As Integer, ByVal G As Integer, ByVal B As Integer) As HSL
        Dim nH As Single, nS As Single, nL As Single
        Dim nR As Single, nG As Single, nB As Single
        Dim ndelR As Single, ndelG As Single, ndelB As Single
        Dim nmax As Single, nmin As Single, ndelMax As Single
        
        nR = (R / 255)
        nG = (G / 255)
        nB = (B / 255)
        nmax = Max(Max(nR, nG), nB)
        nmin = Min(Min(nR, nG), nB)
        ndelMax = nmax - nmin
        nL = (nmax + nmin) / 2
        
        If (ndelMax = 0) Then
            nH = 0
            nS = 0
        Else
            If (nL < 0.5) Then
                nS = ndelMax / (nmax + nmin)
            Else
                nS = ndelMax / (2 - nmax - nmin)
            End If
            ndelR = (((nmax - nR) / 6) + (ndelMax / 2)) / ndelMax
            ndelG = (((nmax - nG) / 6) + (ndelMax / 2)) / ndelMax
            ndelB = (((nmax - nB) / 6) + (ndelMax / 2)) / ndelMax
            If (nR = nmax) Then
                nH = ndelB - ndelG
            ElseIf (nG = nmax) Then
                nH = (1 / 3) + ndelR - ndelB
            ElseIf (nB = nmax) Then
                nH = (2 / 3) + ndelG - ndelR
            End If
            If (nH < 0) Then nH = nH + 1
            If (nH > 1) Then nH = nH - 1
        End If
        RGB2HSL.Hue = nH * 240
        RGB2HSL.Saturation = nS * 240
        RGB2HSL.Luminance = nL * 240
            
    End Function

    ' 转换HSL到RGB
    Public Function HSL2RGB(ByVal H As Integer, ByVal S As Integer, ByVal L As Integer) As RGB
        Dim nH As Single, nS As Single, nL As Single
        Dim nR As Single, nG As Single, nB As Single
        Dim p1 As Single, p2 As Single
        
        nH = H / 240
        nS = S / 240
        nL = L / 240
        If (nS = 0) Then
            nR = nL * 255
            nG = nL * 255
            nB = nL * 255
        Else
            If (nL < 0.5) Then
                p2 = Round(nL * (1 + nS), 2)
            Else
                p2 = Round((nL + nS) - (nS * nL), 2)
            End If
            p1 = Round(2 * nL - p2, 2)
            nR = 255 * Hue2RGB(p1, p2, nH + (1 / 3))
            nG = 255 * Hue2RGB(p1, p2, nH)
            nB = 255 * Hue2RGB(p1, p2, nH - (1 / 3))
        End If
        HSL2RGB.Red = nR
        HSL2RGB.Green = nG
        HSL2RGB.Bue = nB
        
    End Function

    Private Function Hue2RGB(ByVal p1 As Single, ByVal p2 As Single, ByVal Hue As Single) As Single
        
        If (Hue < 0) Then Hue = Hue + 1
        If (Hue > 1) Then Hue = Hue - 1
        If ((6 * Hue) < 1) Then
            Hue2RGB = (p1 + (p2 - p1) * 6 * Hue)
        ElseIf ((2 * Hue) < 1) Then
            Hue2RGB = p2
        ElseIf ((3 * Hue) < 2) Then
            Hue2RGB = p1 + (p2 - p1) * ((2 / 3) - Hue) * 6
        Else
            Hue2RGB = p1
        End If
        
    End Function

  • 相关阅读:
    C语言第三次博客作业单层循环结构
    C语言字符数组
    C语言第一次作业
    C语言作业函数
    C语言嵌套循环
    C语言第二次作业分支结构
    C语言作业数组
    1712新生素拓活动总结
    C语言第0次作业
    C语言作业数据类型
  • 原文地址:https://www.cnblogs.com/sode/p/2892944.html
Copyright © 2011-2022 走看看