如何正确获取 CGColor 的颜色分量

Posted

技术标签:

【中文标题】如何正确获取 CGColor 的颜色分量【英文标题】:How to get color components of a CGColor correctly 【发布时间】:2010-11-11 14:51:51 【问题描述】:

我有一个黑色的 UILabel;

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

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

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

有人知道吗?

我是否传递了不同的色彩空间?

:-(请帮帮我。

【问题讨论】:

【参考方案1】:

很可能是错误的色彩空间。我猜灰度色彩空间的 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]];

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

【讨论】:

嗨fluchtpunkt!感谢您的留言!它可以帮助我了解一些想法..你能告诉我为什么它给出 r=0.000000 g=1.000000 b=0.000000 a=0.000000 当我打印颜色组件时,即使我通过了黑色颜色组件也是绿色组件。非常感谢 我认为CGColorGetComponents生成的指针需要手动解除分配。 不。我错了。 ***.com/questions/6219370/where-is-the-memory-leak【参考方案2】:

您看到类似于r=0g=1b=0a=0 的原因是因为您将返回数组中的值误解为在RGB 颜色模型中。 UIColor 在本例中使用 单色空间 表示 灰度颜色,例如 黑色。 您看到的是一组来自单色模型2 组件。第一个是灰度0 表示黑色),第二个是alpha1 表示不透明)。您正在查看的最后两个值不在 2 元素数组的末尾,在这种情况下恰好是 0

你会注意到如果颜色是黑色,你尝试CGColorGetNumberOfComponents(color.CGColor),它会返回2。如果你尝试CGColorSpaceGetModel(CGColorGetColorSpace(color.CGColor)),它会返回0,它对应于kCGColorSpaceModelMonochrome(参见CGColorSpace.h中的枚举CGColorSpaceModel

见CGColorSpace Reference

【讨论】:

谢谢,现在我明白了。如果他们将灰度和非灰度统一为 4 个分量并没有什么坏处,因为灰度也可以用 RGB 表示。我很惊讶地发现 ios 已经区分了这两者,甚至没有记录这一点:P【参考方案3】:

我认为这是获得任何 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;

【讨论】:

当心!仅限 iOS5+。此外,您不会释放您创建的色彩空间对象。【参考方案4】:

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

Get RGB value from UIColor presets

【讨论】:

【参考方案5】:

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

[layer setBackgroundColor:&lt;#(CGColorRef)#&gt;] 变为:[btnLayer setBorderColor:[[UIColor grayColor] CGColor]];

只需确保按钮的原始颜色不会覆盖图层

【讨论】:

【参考方案6】:
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
    
  

【讨论】:

以上是关于如何正确获取 CGColor 的颜色分量的主要内容,如果未能解决你的问题,请参考以下文章

如何在 SwiftUI 中从颜色中获取 RGB 分量

如何在ios中获取自定义颜色的RGB分量

我可以从 CGGradient 获得 CGColor 吗?

iphone开发:UIColor/CGColor组件对比

如何使用 swift 从带有图案图像的 nscolor 获取 cgcolor?

如何使用 C++ 提取图像中的 r g b 颜色分量