从UIColor获取十六进制颜色

13

我在将UIColor转换为十六进制颜色时遇到问题,以下是我找到的内容:

CGColorRef colorref = [[Colorview_ backgroundColor] CGColor];

int numComponents = CGColorGetNumberOfComponents(colorref);

if (numComponents == 4) {
    const CGFloat *components = CGColorGetComponents(colorref);

    int hexValue = 0xFF0000*components[0] + 0xFF00*components[1] + 0xFF*components[2];

    NSString *hexString = [NSString stringWithFormat:@"#%d", hexValue];
}
这段代码给我返回了#5576149(例如),如你所见有7个数字而非6个,这不是一个十六进制颜色。希望能得到帮助,谢谢。

你可以使用这个库 https://github.com/burhanuddin353/TFTColor - Burhanuddin Sunelwala
5个回答

13

上面的 sylphos 答案对于 darkGrayColor 不起作用。

这个(取自http://softteco.blogspot.jp/2011/06/extract-hex-rgb-color-from-uicolor.html)更有效:

- (NSString *) hexFromUIColor:(UIColor *)color {
    if (CGColorGetNumberOfComponents(color.CGColor) < 4) {
        const CGFloat *components = CGColorGetComponents(color.CGColor);
        color = [UIColor colorWithRed:components[0] green:components[0] blue:components[0] alpha:components[1]];
    }
    if (CGColorSpaceGetModel(CGColorGetColorSpace(color.CGColor)) != kCGColorSpaceModelRGB) {
        return [NSString stringWithFormat:@"#FFFFFF"];
    }
    return [NSString stringWithFormat:@"#%02X%02X%02X", (int)((CGColorGetComponents(color.CGColor))[0]*255.0), (int)((CGColorGetComponents(color.CGColor))[1]*255.0), (int)((CGColorGetComponents(color.CGColor))[2]*255.0)];
}

2

我昨天尝试了这个方法,因为我需要从一个uicolor中获取十六进制颜色,并使其在javascript中也能工作,但当组件为0时,这种方法就不起作用了,因为它会得到一个0而不是00。

所以纯青色应该是RGB 0 255 255,而这段代码将返回#0ffff而不是#00ffff。

我根据你的代码进行了修改,在我的应用程序上运行良好:

-(NSString*)colorToHex:(UIColor*)color{

    CGColorRef colorref = [color CGColor];

    const CGFloat *components = CGColorGetComponents(colorref);

    NSString *hexString = @"#";
    int hexValue = 0;

    for (int i=0; i<3; i++) {
        if (components[i] == 0) {
            hexString = [NSString stringWithFormat:@"%@00", hexString];
        }else{
            hexValue = 0xFF*components[i];
            hexString = [NSString stringWithFormat:@"%@%x", hexString, hexValue];
        }
    }

    return hexString;
}

2
NSString *hexString = [NSString stringWithFormat:@"#%d", hexValue];

你正在使用%d将其格式化为数字。
你想要使用%x或%X将其格式化为十六进制,或者作为字符串%s。我没有检查函数正在做什么以及int hexValue持有什么。

d或i 有符号十进制整数 392

x 无符号十六进制整数 7fa

X 无符号十六进制整数(大写字母) 7FA


谢谢,这个给出了hexString的十六进制颜色,但它与[Colorview_ backgroundColor]不是同一种颜色,似乎缺少了什么,也许是0xFF*components[3],你有什么想法如何将其添加到hexValue中吗? - Elyes Jlassi
如果你要找的颜色是5576149=#5515D5,只需将int转换为hex。 - Sully
NSString *hexString = [NSString stringWithFormat:@"#%X", hexValue]; 这里我得到了一个十六进制值(例如#5515D5),但我的意思是:当我在JavaScript中使用这个十六进制颜色时,我得到的颜色与输入的颜色不完全相同,出现了错误。 - Elyes Jlassi

1
这是一个版本,但格式化为C函数:
static inline NSString *hexFromUIColor(UIColor * _color) {
    if (CGColorGetNumberOfComponents(_color.CGColor) < 4) {
        const CGFloat *components = CGColorGetComponents(_color.CGColor);
        _color = [UIColor colorWithRed:components[0] green:components[0] blue:components[0] alpha:components[1]];
    }
    if (CGColorSpaceGetModel(CGColorGetColorSpace(_color.CGColor)) != kCGColorSpaceModelRGB) {
        return [NSString stringWithFormat:@"#FFFFFF"];
    }
    return [NSString stringWithFormat:@"#%02X%02X%02X", (int)((CGColorGetComponents(_color.CGColor))[0]*255.0), (int)((CGColorGetComponents(_color.CGColor))[1]*255.0), (int)((CGColorGetComponents(_color.CGColor))[2]*255.0)];
}

0

UIColor扩展 { 便利init(hexString: String, alpha: CGFloat = 1.0) { let hexString: String = hexString.trimmingCharacters(in: CharacterSet.whitespacesAndNewlines) let scanner = Scanner(string: hexString) } }

    if (hexString.hasPrefix("#")) {
        scanner.scanLocation = 1
    }

    var color: UInt32 = 0
    scanner.scanHexInt32(&color)

    let mask = 0x000000FF
    let r = Int(color >> 16) & mask
    let g = Int(color >> 8) & mask
    let b = Int(color) & mask

    let red   = CGFloat(r) / 255.0
    let green = CGFloat(g) / 255.0
    let blue  = CGFloat(b) / 255.0

    self.init(red:red, green:green, blue:blue, alpha:alpha)
}

func toHexString() -> String {
    var r:CGFloat = 0
    var g:CGFloat = 0
    var b:CGFloat = 0
    var a:CGFloat = 0

    getRed(&r, green: &g, blue: &b, alpha: &a)

    let rgb:Int = (Int)(r*255)<<16 | (Int)(g*255)<<8 | (Int)(b*255)<<0

    return String(format:"#%06x", rgb)
}

}

你可以简单地使用以下方法来创建RGB颜色:

let color = UIColor(hexString: "#3f3f3f")


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接