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

  • 相关阅读:
    explode — 使用一个字符串分割另一个字符串
    echo — 输出一个或多个字符串
    count_chars — 返回字符串所用字符的信息
    convert_uuencode — 使用 uuencode 编码一个字符串
    convert_uudecode — 解码一个 uuencode 编码的字符串
    convert_cyr_string — 将字符由一种 Cyrillic 字符转换成另一种
    chunk_split — 将字符串分割成小块
    chr — 返回指定的字符
    addslashes — 使用反斜线引用字符串
    addcslashes — 以 C 语言风格使用反斜线转义字符串中的字符
  • 原文地址:https://www.cnblogs.com/sode/p/2892944.html
Copyright © 2011-2022 走看看