如何正确获取CGColor的颜色组件

时间:2010-11-11 14:51:52

标签: iphone quartz-graphics cgcolor cgcolorspace

我有一个黑色的UILabel;

我正在编写以下代码以获取黑色组件。

UIColor *aColor = [aLabel.textColor retain];
const CGFloat* components = CGColorGetComponents(aColor.CGColor);
CGColorSpaceRef colorSpace=CGColorSpaceCreateDeviceRGB();

但总是给出绿色成分而不是黑色成分;

有人对此有所了解吗?

我是否通过了不同的色彩空间?

:-(请帮帮我。

6 个答案:

答案 0 :(得分:13)

很可能是错误的色彩空间。我想灰度色空间的alpha分量会得到你认为绿色成分的位置 我使用这个函数从UIColor创建一个字符串,我只遇到RGB和灰度颜色空间,所以我只用少于4(R + G + B + A)组件的每种颜色解释为灰度。

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) {
    NSLog(@"no rgb colorspace");
    // do seomthing
}
const CGFloat *components = CGColorGetComponents(color.CGColor);
NSString *colorAsString = [NSString stringWithFormat:@"%f,%f,%f,%f", components[0], components[1], components[2], components[3]];

当然这种方法并不适用于所有情况,您应该根据您的要求采用它。

答案 1 :(得分:6)

您看到r=0g=1b=0a=0的原因是因为您错误地将返回数组中的值误解为{ {1}}颜色模型。 RGB黑色中使用单色空间,例如黑色
您所看到的是来自单色模型UIColor组件数组。第一个是灰度级(黑色为2),第二个为 alpha 0为opaque)。您正在查看的最后两个值不在1元素数组的末尾,在这种情况下恰好是2

如果颜色为黑色并尝试0,您会注意到它会返回CGColorGetNumberOfComponents(color.CGColor)。如果您尝试2,则会返回与CGColorSpaceGetModel(CGColorGetColorSpace(color.CGColor))对应的0(请参阅kCGColorSpaceModelMonochrome中的枚举CGColorSpaceModel

请参阅CGColorSpace Reference

答案 2 :(得分:2)

我认为这是获取任何UIColor *的rgb表示的一种非常好的方法,它已经有一种方便的方法来保留它的组件。

-(CGColorRef)CGColorRefFromUIColor:(UIColor*)newColor {
     CGFloat components[4] = {0.0,0.0,0.0,0.0};
     [newColor getRed:&components[0] green:&components[1] blue:&components[2]        alpha:&components[3]];
     CGColorRef newRGB = CGColorCreate(CGColorSpaceCreateDeviceRGB(), components);
     return newRGB;
}

答案 3 :(得分:1)

获取RGB的一种方法是将颜色绘制到图形上下文中并将颜色读回。请参阅我对此问题的回答,例如代码:

Get RGB value from UIColor presets

答案 4 :(得分:0)

使用UIColor的工作示例: CALayer * btnLayer = [myLittleButton layer];

[layer setBackgroundColor:<#(CGColorRef)#>]变为:[btnLayer setBorderColor:[[UIColor grayColor] CGColor]];

确保按钮原始颜色不覆盖图层

答案 5 :(得分:0)

extension UIColor {

  func toRGB() -> UIColor? {
    guard let model = cgColor.colorSpace?.model else {
      return nil
    }
    
    let components = cgColor.components

    switch model {
    case .rgb:
      return UIColor(red: components?[0] ?? 0.0, green: components?[1] ?? 0.0, blue: components?[2] ?? 0.0, alpha: components?[3] ?? 0.0)
    case .monochrome:
      return UIColor(red: components?[0] ?? 0.0, green: components?[0] ?? 0.0, blue: components?[0] ?? 0.0, alpha: components?[1] ?? 0.0)
    default:
      return nil
    }
  }
}