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

我有一个黑色的 UILabel;

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

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

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

有人知道吗?

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

:-(请帮帮我。

【问题讨论】:

    标签: iphone quartz-graphics cgcolor cgcolorspace


    【解决方案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生成的指针需要手动解除分配。
    【解决方案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
            }
          }
        }
        

        【讨论】:

          猜你喜欢
          • 2021-11-20
          • 2017-12-05
          • 2023-02-12
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-05-14
          • 1970-01-01
          相关资源
          最近更新 更多