UIColor 中提取 RGBA

之前遇到一些获取颜色RGB的需求,在这里记录下


UIColor *color = [UIColor redColor];
// 普通颜色可以通过 这个方法获取的RGBA的值
// 颜色空间是固定的,对应RGBA
const CGFloat *cmp = CGColorGetComponents(fColor.CGColor);
r = cmp[0];
g = cmp[1];
b = cmp[2];
a = cmp[3];

有些颜色是获取不到RGBA的, 比如 [UIColor whiteColor] [UIColor blackColor] [UIColor colorWithWhite: alpha:] 这些方法创建的
通过 colorWithRed: green: blue: alpha: 创建的肯定能够获取到RGBA, 所以
可以通过这个方法获取颜色通道数量


unsigned long int fNum = CGColorGetNumberOfComponents(fColor.CGColor);
if (fNum == 4) {
    // 在调用上面的方法获取RGBA
}

用这个方法可以获取到


+ (void)cx_getRGBComponents:(CGFloat [3])cmp forColor:(UIColor *)color {
    CGColorSpaceRef spaceRef = CGColorSpaceCreateDeviceRGB();
    unsigned char resultPixel[4];
    CGContextRef ctx = CGBitmapContextCreate(&resultPixel, 1, 1, 8, 4, spaceRef, kCGImageAlphaNoneSkipLast);
    CGContextSetFillColorWithColor(ctx, [color CGColor]);
    CGContextFillRect(ctx, CGRectMake(0, 0, 1, 1));
    CGContextRelease(ctx);
    CGColorSpaceRelease(spaceRef);
    
    for (int i = 0; i < 3; i++) {
        cmp[i] = resultPixel[i] / 255.0;
    }
}

如何使用


CGFloat cmp[3];
[self cx_getRGBComponents:cmp forColor:[UIColor whiteColor]];
r = cmp[0];
g = cmp[1];
b = cmp[2];

你可能感兴趣的:(UIColor 中提取 RGBA)