我有一个黑色的UILabel;
我正在编写以下代码以获取黑色组件。
UIColor *aColor = [aLabel.textColor retain];
const CGFloat* components = CGColorGetComponents(aColor.CGColor);
CGColorSpaceRef colorSpace=CGColorSpaceCreateDeviceRGB();
但总是给出绿色成分而不是黑色成分;
有人对此有所了解吗?
我是否通过了不同的色彩空间?
:-(请帮帮我。
答案 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=0
,g=1
,b=0
,a=0
的原因是因为您错误地将返回数组中的值误解为{ {1}}颜色模型。 RGB
在黑色中使用单色空间,例如黑色。
您所看到的是来自单色模型的UIColor
组件数组。第一个是灰度级(黑色为2
),第二个为 alpha (0
为opaque)。您正在查看的最后两个值不在1
元素数组的末尾,在这种情况下恰好是2
。
如果颜色为黑色并尝试0
,您会注意到它会返回CGColorGetNumberOfComponents(color.CGColor)
。如果您尝试2
,则会返回与CGColorSpaceGetModel(CGColorGetColorSpace(color.CGColor))
对应的0
(请参阅kCGColorSpaceModelMonochrome
中的枚举CGColorSpaceModel
)
答案 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的一种方法是将颜色绘制到图形上下文中并将颜色读回。请参阅我对此问题的回答,例如代码:
答案 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
}
}
}