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)dc_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 dc_getRGBComponents:cmp forColor:[UIColor whiteColor]];
r = cmp[0];
g = cmp[1];
b = cmp[2];

 

上一篇:「SNOI2019」字符串


下一篇:Python sorted函数详解(高级篇)