博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
iOS HSV
阅读量:5996 次
发布时间:2019-06-20

本文共 1380 字,大约阅读时间需要 4 分钟。

先贴上转换公式

直接上代码

+ (HSV)HSVFromRGB:(NSString *)RGB{

    if ([RGB hasPrefix:@"#"]) {

        RGB = [RGB substringFromIndex:1];

    }

    if (![RGB isLegal]) {

        return HSVMake(0, 0, 0);

    }

    if (RGB.length == 3) {

        RGB = [RGB stringByAppendingString:RGB];

    }

    NSString *Rs = [RGB substringToIndex:2];

    NSString *Gs = [RGB substringWithRange:NSMakeRange(2, 2)];

    NSString *Bs = [RGB substringFromIndex:4];

    unsigned int Ri, Gi, Bi;

    NSScanner *scannerR = [NSScanner scannerWithString:Rs];

    NSScanner *scannerG = [NSScanner scannerWithString:Gs];

    NSScanner *scannerB = [NSScanner scannerWithString:Bs];

    

    [scannerR scanHexInt:&Ri];

    [scannerG scanHexInt:&Gi];

    [scannerB scanHexInt:&Bi];

    

    CGFloat Rf = (double)Ri/255.0;

    CGFloat Gf = (double)Gi/255.0;

    CGFloat Bf = (double)Bi/255.0;

    

    CGFloat Cmax = [(id)[CHelps CMaxWithArray:@[@(Rf),@(Gf),@(Bf)]] floatValue];

    CGFloat Cmin = [(id)[CHelps CMinWithArray:@[@(Rf),@(Gf),@(Bf)]] floatValue];

    CGFloat Cdiff = Cmax - Cmin;

    

    CGFloat H, S, V;

    if (Cdiff == 0) {

        H = 0;

    }else {

        if (Cmax == Rf) {

            H = 60*((Gf - Bf)/Cdiff + 0);

        }else if (Cmax == Gf){

            H = 60*((Bf - Rf)/Cdiff + 2);

        }else{

            H = 60*((Rf - Gf)/Cdiff + 4);

        }

    }

    if (H < 0) {

        H = H + 360;

    }

    H = H/360.0f;

    if (Cmax == 0) {

        S = 0;

    }else{

        S = Cdiff/Cmax;

    }

    V = Cmax;

    

    HSV hsv = HSVMake(H, S, V);

    return hsv;

}

尤其要注意最后色域H值虽是0度~360度,但在iOS上是H/360.0f。

对比了很长时间,值都对,就是颜色不对,原来是因为这。

转载于:https://www.cnblogs.com/chenfeichenyang/p/11002043.html

你可能感兴趣的文章
Eclipse中如何安装和使用GrepCode插件 (转)
查看>>
神经网络和机器学习、强人工智能
查看>>
JavaScript内部原理实践——真的懂JavaScript吗?(转)
查看>>
【DeepLearning】Exercise:Softmax Regression
查看>>
Android JNI入门第四篇——Android.mk文件分析
查看>>
Get a developer license for windows store app
查看>>
策略模式
查看>>
Android Studio导入第三方类库的方法
查看>>
利用try-catch判断变量是已声明未声明还是未赋值
查看>>
zxing二维码
查看>>
android中 回调方法,怎么转变为阻塞执行的方法
查看>>
.NET平台下的微信SDK(Rabbit.WeiXin)开源发布
查看>>
简要介绍如何集成Vitamio安卓版SDK
查看>>
BZOJ1107 : [POI2007]驾驶考试egz
查看>>
div与span区别及用法
查看>>
Senparc.Weixin.MP SDK 微信公众平台开发教程(十六):AccessToken自动管理机制
查看>>
【转载】COM小结
查看>>
Python的高级特性2:列表推导式,生成器与迭代器
查看>>
Ubuntu 14.04 64位字体美化(使用黑文泉驿)
查看>>
[android] AndroidManifest.xml - 【 manifest -> permission】
查看>>