如何将NSString中的十六进制颜色转换为Objective C中的三个单独的rgb整数?

时间:2011-10-01 12:34:46

标签: iphone objective-c colors nsstring hex

我可能会做一些极其复杂的简单事情,但到目前为止我没有尝试过的任何东西似乎都有效。

我有像@“BD8F60”这样的NSStrings,我想把它们变成像:r = 189,g = 143,b = 96。

已经找到了将已经整数的十六进制值转换为rgb整数的方法,但我仍然坚持如何将带有字母的NSString更改为一个int,其中字母已经转换为数字对应的字符串。如果这是非常基本的话,请提前道歉 - 我仍然在非常基本的水平上学习这些东西。

3 个答案:

答案 0 :(得分:12)

您需要解析NSString并解释十六进制值。

您可以通过多种方式执行此操作,一种是使用NSScanner

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
} else {
  NSLog(@"Parsing error: no hex value found in string");
}

还有其他一些可能性,例如将字符串拆分为3并分别扫描值(而不是按位移和屏蔽),但这个想法保持不变。

注意:正如scanHexInt:文档所述,如果您的字符串前缀为0x,例如@"0xBD8F60",则此功能也适用。不会自动使用前缀为@"#BD8F60"之类的字符串的字符串。在这种情况下使用子字符串。

答案 1 :(得分:4)

此方法将给定的十六进制字符串转换为UIColor

- (UIColor *)colorWithHexString:(NSString *)stringToConvert {
    NSScanner *scanner = [NSScanner scannerWithString:stringToConvert];
    unsigned hex;
    if (![scanner scanHexInt:&hex]) return nil;
    int r = (hex >> 16) & 0xFF;
    int g = (hex >> 8) & 0xFF;
    int b = (hex) & 0xFF;

    return [UIColor colorWithRed:r / 255.0f
                           green:g / 255.0f
                            blue:b / 255.0f
                           alpha:1.0f];
}

答案 2 :(得分:0)

UIColor上的一个类别,它也处理alpha值rrggbbaa和短格式为rgb或rgba。

一样使用它
UIColor *color = [UIColor colorFromHexString:@"#998997FF"]; //#RRGGBBAA

UIColor *color = [UIColor colorFromHexString:@"998997FF"]; //RRGGBBAA

UIColor *color = [UIColor colorFromHexString:@"0x998997FF"];// 0xRRGGBBAA

UIColor *color = [UIColor colorFromHexString:@"#999"]; // #RGB -> #RRGGBB

UIColor *color = [UIColor colorFromHexString:@"#9acd"]; // #RGBA -> #RRGGBBAA

@implementation UIColor (Creation)

+(UIColor *)_colorFromHex:(NSUInteger)hexInt
{
    int r,g,b,a;

    r = (hexInt >> 030) & 0xFF;
    g = (hexInt >> 020) & 0xFF;
    b = (hexInt >> 010) & 0xFF;
    a = hexInt & 0xFF;

    return [UIColor colorWithRed:r / 255.0f
                           green:g / 255.0f
                            blue:b / 255.0f
                           alpha:a / 255.0f];
}

+(UIColor *)colorFromHexString:(NSString *)hexString
{
    hexString = [hexString stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]];
    if ([hexString hasPrefix:@"#"]) 
        hexString = [hexString substringFromIndex:1];
    else if([hexString hasPrefix:@"0x"])
        hexString = [hexString substringFromIndex:2];

    int l = [hexString length];
    if ((l!=3) && (l!=4) && (l!=6) && (l!=8))
        return nil;

    if ([hexString length] > 2 && [hexString length]< 5) {        
        NSMutableString *newHexString = [[NSMutableString alloc] initWithCapacity:[hexString length]*2];
        [hexString enumerateSubstringsInRange:NSMakeRange(0, [hexString length]) 
                                      options:NSStringEnumerationByComposedCharacterSequences 
                                   usingBlock:^(NSString *substring, 
                                                NSRange substringRange, 
                                                NSRange enclosingRange, 
                                                BOOL *stop) 
        {
            [newHexString appendFormat:@"%@%@", substring, substring];
        }];
        hexString = newHexString;
    }

    if ([hexString length] == 6)
        hexString = [hexString stringByAppendingString:@"ff"];    

    NSScanner *scanner = [NSScanner scannerWithString:hexString];
    unsigned hexNum;
    if (![scanner scanHexInt:&hexNum]) 
        return nil;    
    return [self _colorFromHex:hexNum];
}

@end 

在swift中使用它:

  • #include "UIColor+Creation.h"添加到“桥接标题”
  • 使用

    UIColor(fromHexString:"62AF3C")