如何检查目标C中NSString中的十六进制颜色是浅还是暗?

时间:2011-09-30 20:50:49

标签: iphone objective-c

我找到了这个问题的答案,解释了如何将NSString十六进制转换为UIColor(我已经完成了这个)和其他解释如何将RGB转换为HSB,以及其他解释如何确定RGB的亮度和暗度,但是我想知道是否有一种更直接的方法来解决这个问题,不涉及到六角形 - > UIColor-> rgb-> hsb-> b。 Hex-> hsb,例如?或hex-> rgb->亮度计算?

我每次加载视图时都会改变颜色的背景(来自XML的十六进制值),我需要将顶部的文本相应地更改为白色或黑色,这样它才能保持清晰。

非常感谢帮助,我已经开了好几天了。

3 个答案:

答案 0 :(得分:2)

请参阅Formula to determine brightness of RGB color

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

how to convert hexadecimal to RGB

要获得三个整数而不是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。)

答案 1 :(得分:0)

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

答案 2 :(得分:0)

除了上述内容之外,这是另一种解决方案,从其他人的答案和elsewhere汇总起来。

    - (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;
}    

}