如何在Objective C中检查NSString的十六进制颜色是浅色还是深色



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

我有背景,改变颜色每次视图加载(十六进制值从XML),我需要有顶部的文本更改为白色或黑色,因此它将保持清晰。

非常感谢你的帮助,我已经考虑这个问题好几天了

参见RGB颜色亮度计算公式

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

如何将十六进制转换为RGB

要获得三个int而不是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=%dn", r, g, b);
}

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

红、绿、蓝分量的最大值似乎决定了一种颜色在HSB意义上的"亮度"。

除此之外,这是另一种解决方案,汇集了其他人在这里和其他地方的答案。

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

}

最新更新