如何正确获取 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=0
、g=1
、b=0
、a=0
的原因是因为您将返回数组中的值误解为在RGB
颜色模型中。 UIColor
在本例中使用 单色空间 表示 灰度颜色,例如 黑色。
您看到的是一组来自单色模型的2
组件。第一个是灰度(0
表示黑色),第二个是alpha(1
表示不透明)。您正在查看的最后两个值不在 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:<#(CGColorRef)#>]
变为:[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 的颜色分量的主要内容,如果未能解决你的问题,请参考以下文章