我找到了这个问题的答案,解释了如何将NSString十六进制转换为UIColor(我已经完成了这个)和其他解释如何将RGB转换为HSB,以及其他解释如何确定RGB的亮度和暗度,但是我想知道是否有一种更直接的方法来解决这个问题,不涉及到六角形 - > UIColor-> rgb-> hsb-> b。 Hex-> hsb,例如?或hex-> rgb->亮度计算?
我每次加载视图时都会改变颜色的背景(来自XML的十六进制值),我需要将顶部的文本相应地更改为白色或黑色,这样它才能保持清晰。
非常感谢帮助,我已经开了好几天了。
答案 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;
}
}