Iphone 如何检查NSString中的十六进制颜色在Objective C中是亮还是暗?

Iphone 如何检查NSString中的十六进制颜色在Objective C中是亮还是暗?,iphone,objective-c,Iphone,Objective C,我找到了这个问题的答案,解释了如何将NSString十六进制转换为UIColor(我已经这样做了),其他人解释了如何将RGB转换为HSB,其他人解释了如何确定RGB的明暗度,但我想知道是否有一种更直接的方法可以解决这个问题,而不需要使用十六进制->UIColor->rgb->hsb->b。 比如说Hex->hsb?或者十六进制->rgb->亮度计算 我的背景在每次加载视图时都会改变颜色(XML中的十六进制值),我需要将顶部的文本相应地更改为白色或黑色,以便保持清晰 非常感谢您的帮助,我已经讨论了

我找到了这个问题的答案,解释了如何将NSString十六进制转换为UIColor(我已经这样做了),其他人解释了如何将RGB转换为HSB,其他人解释了如何确定RGB的明暗度,但我想知道是否有一种更直接的方法可以解决这个问题,而不需要使用十六进制->UIColor->rgb->hsb->b。 比如说Hex->hsb?或者十六进制->rgb->亮度计算

我的背景在每次加载视图时都会改变颜色(XML中的十六进制值),我需要将顶部的文本相应地更改为白色或黑色,以便保持清晰


非常感谢您的帮助,我已经讨论了好几天了。

红色、绿色和蓝色分量的最大值似乎决定了HSB意义上颜色的“亮度”。

请参阅

十六进制颜色通常是RRGGBB或RRGGBBAA(alpha)

要获得三个整数而不是UIColor,可以将答案从该整数修改为:

void rgb_from_hex(char *hexstring, int *red, int *green, int *blue) {
    // convert everything after the # into a number
    long x = strtol(hexstring+1, NULL, 16);

    // extract the bytes
    *blue = x & 0xFF;
    *green = (x >> 8) & 0xFF;
    *red = (x >> 16) & 0xFF;
}

// The above function is used like this:
int main (int argc, const char * argv[])
{
    int r,g,b;
    rgb_from_hex("#123456", &r, &g, &b);
    printf("r=%d, g=%d, b=%d\n", r, g, b);
}

(该函数可能只正确处理RGB,而不是RGBA。)

除上述内容外,这是另一个解决方案,将其他人的答案放在一起

-(BOOL)hasDkBg{
NSScanner*scanner=[NSScanner scannerWithString:@“BD8F60”];
int十六进制;
if([scanner scanHexInt:&hex]){
//解析成功。我们有一个表示0xBD8F60值的大整数
int r=(十六进制>>16)&0xFF;//获取第一个字节
int g=(十六进制>>8)&0xFF;//获取中间字节
int b=(十六进制)&0xFF;//获取最后一个字节
int亮度=((r*299)+(g*587)+(b*114))/1000;//获取亮度值
如果(亮度<127){//127=可能亮度值的中间值
返回YES;
}
否则返回NO;
}    

}

你的十六进制颜色是什么格式的?我不确定我的回答是否正确,但是标准的网络颜色,例如“#F2AA6B”。如果是这样,白色(#ffffff)的亮度将与蓝色(#0000ff)相同。它确实如此。它只是有一个不同的饱和度。HSV颜色空间并不模拟颜色外观,它只是RGB到另一组轴的映射。好的,你说得对。我在考虑可感知的亮度。很抱歉,如果答案未经编辑,我似乎无法删除它。这实际上是一个有趣的观点——我假设(以及其他人在前面的问题中的假设)在HSB中,亮度与“亮度”相同,例如在眼睛看来是亮的还是暗的。看来饱和度是我要找的。编辑:又错了。饱和度限制加上亮度限制。@spongfile:搜索得到了我的答案,这和你遇到的问题是一样的。它还列出了建议亮度和色调差异的指导原则,因此,例如,如果黑色文本“足够好”,即使白色文本在数字上提供了更多对比度,您也可以选择黑色文本。(我相信这个公式和Jacob链接到的公式是一样的。)我在前面研究了十六进制到RGB的问题,但答案似乎将十六进制转换为UIColor。UIColor是否与RGB相同,例如,我是否可以分别从UIColor访问R、G和B组件?从文档中看,UIColor似乎包裹了CGColor,它相当不透明,不进行颜色空间转换。在这种情况下,我仍然缺少将十六进制值转换为RGB值的方法(例如四个int值(R、G、B、a)),虽然根本不涉及UIColor。上述问题的答案将直接从十六进制字符串转到UIColor。(或者从十六进制NSString转换为rgb INT是如此简单,以至于没有人想到它是如何实现的?)链接的答案/确实/转换为三个rgb INT,它只是将它们包装在最末端的UIColor中。将它们包装成int[]应该是相当容易的。@spongefile:是的,我(不知怎的)设法使C工作来进行转换,我把它添加到了答案中。
    - (BOOL)hasDkBg {    
        NSScanner* scanner = [NSScanner scannerWithString:@"BD8F60"];
        int hex;
        if ([scanner scanHexInt:&hex]) {
            // Parsing successful. We have a big int representing the 0xBD8F60 value
            int r = (hex >> 16) & 0xFF; // get the first byte
            int g = (hex >>  8) & 0xFF; // get the middle byte
            int b = (hex      ) & 0xFF; // get the last byte

            int lightness = ((r*299)+(g*587)+(b*114))/1000; //get lightness value

    if (lightness < 127) { //127 = middle of possible lightness value
        return YES;
    }
    else return NO;
}