美文网首页iOS开发
iOS RGB与HSB数值转换算法

iOS RGB与HSB数值转换算法

作者: 水煮杰尼龟 | 来源:发表于2018-07-19 17:14 被阅读235次
    简介

    RGB色彩模式是工业界的一种颜色标准,是通过对红(R)、绿(G)、蓝(B)三个颜色通道的变化以及它们相互之间的叠加来得到各式各样的颜色的,RGB即是代表红、绿、蓝三个通道的颜色,这个标准几乎包括了人类视力所能感知的所有颜色,是目前运用最广的颜色系统之一。
    HSB又称HSV,表示一种颜色模式:在HSB模式中,H(hues)表示色相,S(saturation)表示饱和度,B(brightness)表示亮度HSB模式对应的媒介是人眼。
    HSB模式中S和B呈现的数值越高,饱和度明度越高,页面色彩强烈艳丽,对视觉刺激是迅速的,醒目的效果,但不益于长时间的观看。
    色相(H,hue):在0~360°的标准色轮上,色相是按位置度量的。在通常的使用中,色相是由颜色名称标识的,比如红、绿或橙色。黑色和白色无色相。
    饱和度(S,saturation):表示色彩的纯度,为0时为灰色。白、黑和其他灰色色彩都没有饱和度的。在最大饱和度时,每一色相具有最纯的色光。取值范围0~100%。
    亮度(B,brightness或V,value):是色彩的明亮度。为0时即为黑色。最大亮度是色彩最鲜明的状态。取值范围0~100%。

    不瞎bb了 ,先上代码。

    func rgbTohsb(r:Float,g:Float,b:Float) ->(Array<Float>)
        {
            var Max : Float,Min : Float,H : Float = 0,S : Float = 0,B : Float = 0
            Max = max(max(r, g), b)
            Min = min(min(r, g), b)
            S = Max==0 ? 0:(1-Min/Max)*100
            B = Max/255*100
            if Max==Min {
                H = 0
                return [ceilf(H),ceilf(S),ceilf(B)]
            }
            if Max==r&&g>=b {
                H = 60*(g-b)/(Max-Min)+0
            }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
            }
            return [ceilf(H),ceilf(S),ceilf(B)]
        }
    
    func hsbTorgb(h:Float,s:Float,b:Float) ->(Array<Float>)
        {
            var h1 : Int , a : Int
            var f : Float,p : Float,q : Float,t : Float,R : Float = 0,G : Float = 0,B : Float = 0
            a=Int(h/60)
            h1=a%6
            f=h/60-Float(h1)
            p=b/100*(1-s/100)
            q=b/100*(1-f*s/100)
            t=b/100*(1-(1-f)*s/100)
            switch h1 {
            case 0:
                R=b/100
                G=t
                B=p
                break
            case 1:
                R=q
                G=b/100
                B=p
                break
            case 2:
                R=p
                G=b/100
                B=t
                break
            case 3:
                R=p
                G=q
                B=b/100
                break
            case 4:
                R=t
                G=p
                B=b/100
                break
            case 5:
                R=b/100
                G=p
                B=q
                break
            default:
                break
            }
            
            return [ceilf(R*255),ceilf(G*255),ceilf(B*255)]
        }
    

    以上两个方法就是互相转换的数值算法了,当然也还有其他的转换方式。
    比如苹果其实已经给我们提供好了方法:
    不过苹果的方法都是通过UIColor来处理的,比如给你三个rgb数值,或者hsb数值,你先要得到UIColor再做互相转换。当然都是可以的咯,看个人需求了吧。
    一般来说,UI给我们用的颜色基本就是RGB(200,76,100)数值,或者是二进制(#FFFFFF)了。
    你可以通过 + (UIColor *)colorWithRed:(CGFloat)red green:(CGFloat)green blue:(CGFloat)blue alpha:(CGFloat)alpha; 得到UIColor.
    然后可以通过 - (BOOL)getHue:(nullable CGFloat *)hue saturation:(nullable CGFloat *)saturation brightness:(nullable CGFloat *)brightness alpha:(nullable CGFloat *)alpha NS_AVAILABLE_IOS(5_0); 拿到相应的hsb各个值。反之 也有对应的方法通过hsb拿到颜色,再得到相应的rgb值。

    如果是二进制,一样的先拿到UIColor就行了。
    最后放一个二进制转UIColor方法吧

    + (UIColor *)colorFromHexRGB:(NSString *)colorString alpha:(CGFloat)alpha;
    {
        if ([colorString containsString:@"#"]) {
            colorString=[colorString stringByReplacingOccurrencesOfString:@"#" withString:@""];
        }
        UIColor *result = nil;
        unsigned int colorCode = 0;
        unsigned char redByte, greenByte, blueByte;
        
        if (nil != colorString)
        {
            NSScanner *scanner = [NSScanner scannerWithString:colorString];
            (void) [scanner scanHexInt:&colorCode]; // ignore error
        }
        redByte = (unsigned char) (colorCode >> 16);
        greenByte = (unsigned char) (colorCode >> 8);
        blueByte = (unsigned char) (colorCode); // masks off high bits
        result = [UIColor
                  colorWithRed: (float)redByte / 0xff
                  green: (float)greenByte/ 0xff
                  blue: (float)blueByte / 0xff
                  alpha:alpha];
        return result;
    }
    
        总而言之,不同需求不同方式去操作就行了。
    

    相关文章

      网友评论

        本文标题:iOS RGB与HSB数值转换算法

        本文链接:https://www.haomeiwen.com/subject/zeohjftx.html