swift--RGB轉HSV、HSB和HSL

HSV、HSB和HSL的區別

HSB 爲 色相,飽和度,明度。

HSL 爲 色相,飽和度,亮度。

HSV 爲色相,飽和度,明度。

HSB 和 HSV 算法一致,HSL稍有區別

 

轉換公式

參考 CSDN博主「Sunshine_in_Moon」的原創文章 RGB轉到HSV和HSL公式


代碼

注意:ios中UIColor初始化只接受HSB,該方法返回的hue值範圍爲0-360,但是iOS中取值範圍爲0-1,需要將返回的hue除以360

RGB轉HSL,參數爲rgb(取值範圍0-255),返回一個包含hsl的元組

func rgbToHsl(red:CGFloat, green:CGFloat, blue:CGFloat) -> (h:CGFloat, s:CGFloat, l:CGFloat){
        let r:CGFloat = red/255
        let g:CGFloat = green/255
        let b:CGFloat = blue/255
        print("r = \(r), g = \(g), b = \(b)")
        
        let Max:CGFloat = max(r, g, b)
        let Min:CGFloat = min(r, g, b)

        //h 0-360
        var h:CGFloat = 0
        if Max == Min {
            h = 0.0
        }else if Max == r && g >= b {
            h = 60 * (g-b)/(Max-Min)
        } else if Max == r && g < b {
            h = 60 * (g-b)/(Max-Min) + 360
        } else if Max == g {
            h = 60 * (b-r)/(Max-Min) + 120
        } else if Max == b {
            h = 60 * (r-g)/(Max-Min) + 240
        }
        print("h = \(h)")
        
        //l 0-1
        let l:CGFloat = (r + g + b) / 3
        print("l = \(l)")
        
        //s 0-1
        var s:CGFloat = 0
        if l == 0 || Max == Min {
            s = 0
        } else if l > 0 && l <= 0.5 {
            s = (Max - Min)/(2*l)
        } else if l > 0.5 {
            s = (Max - Min)/(2 - 2*l)
        }
        print("s = \(s)")
            
        return (h, s, l)
    }

RGB轉HSV,參數爲rgb(取值範圍0-255),返回一個包含hsv的元組 

func rgbToHsv(red:CGFloat, green:CGFloat, blue:CGFloat) -> (h:CGFloat, s:CGFloat, v:CGFloat){
        let r:CGFloat = red/255
        let g:CGFloat = green/255
        let b:CGFloat = blue/255
        print("r = \(r), g = \(g), b = \(b)")
        
        let Max:CGFloat = max(r, g, b)
        let Min:CGFloat = min(r, g, b)

        //h 0-360
        var h:CGFloat = 0
        if Max == Min {
            h = 0.0
        }else if Max == r && g >= b {
            h = 60 * (g-b)/(Max-Min)
        } else if Max == r && g < b {
            h = 60 * (g-b)/(Max-Min) + 360
        } else if Max == g {
            h = 60 * (b-r)/(Max-Min) + 120
        } else if Max == b {
            h = 60 * (r-g)/(Max-Min) + 240
        }
        print("h = \(h)")
        
        //s 0-1
        var s:CGFloat = 0
        if Max == 0 {
            s = 0
        } else {
            s = (Max - Min)/Max
        }
        print("s = \(s)")
        
        //v
        let v:CGFloat = Max
        print("v = \(v)")
        
        return (h, s, v)
    }

調用

let hsv = rgbToHsv(red: 255, green: 230, blue: 105)
let color = UIColor(hue: hsv.h/360, saturation: hsv.s, brightness: hsv.v, alpha: 1)
self.view.backgroundColor = color

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章