我有一个红色的物体:
红色对象=uicolor.red.cgcolor
我想得到这个“红色”的色调饱和度亮度和alpha参数,这样我就可以用更具体的参数重新编码我的红色和对象。
这个练习只有一次,但我需要这些参数。
我试过cgcolor.components,但我认为这不是正确的函数:
red_test = UIColor.red.cgColor
let output = red_test.components
print(output) = Optional([1.0, 0.0, 0.0, 1.0])
但是如果我运行以下命令
let circlePathT = UIBezierPath(arcCenter: CGPoint(x: x_mid,y: y_mid), radius: CGFloat(20), startAngle: CGFloat(0), endAngle:CGFloat(Double.pi * 2), clockwise: true)
let red_object = CAShapeLayer()
red_object.fillColor = UIColor(hue: 1, saturation: 0, brightness: 0, alpha: 1).cgColor
我有一个黑色的圆圈,不是红色的。
更确切地说,我期待
red_object.fillColor = UIColor(hue: 1, saturation: 0, brightness: 0, alpha: 1).cgColor
相等
red_test = UIColor.red.cgColor
但事实并非如此
最佳答案
为什么你得到了“错误的”组件值
你会发现acomponents
的CGColor
是颜色空间中组件的值。因为存在no hue-saturation-brighness-alpha color space model,所以这些不会是颜色的色调饱和度或亮度。
相反,您可能会在rgb颜色空间模型(如UIColor.red
)中找到颜色的红-绿-蓝alpha值,或者在单色颜色空间模型(如UIColor.gray
)中找到颜色的白色alpha值。
UIColor.red.cgColor.components // [1.0, 0.0, 0.0, 1.0]
UIColor.red.cgColor.colorSpace?.name. // kCGColorSpaceExtendedSRGB
UIColor.gray.cgColor.components // [0.5, 1.0]
UIColor.gray.cgColor.colorSpace?.name // kCGColorSpaceExtendedGray
看一下红色(
1, 0, 0, 1
)的分量值,就知道它们不是色调、饱和度、亮度和α-因为亮度为0的任何颜色都是完全黑色的,饱和度为0的任何颜色都是完全不饱和的。相反,我们希望
red
的亮度和饱和度都为100%,就像它们在颜色选择器中的显示一样:如何获取颜色的色调、饱和度、亮度和alpha
如果要获取颜色的色调、饱和度、亮度和alpha,不管它在哪个颜色空间中,都要使用
getHue(_:saturation:brightness:alpha:)
并将四个可变指针传递给CGFloat
值:var hue : CGFloat = 0
var saturation : CGFloat = 0
var brightness : CGFloat = 0
var alpha : CGFloat = 0
let couldBeConverted = UIColor.red.getHue(&hue, saturation: &saturation, brightness: &brightness, alpha: &alpha)
if couldBeConverted {
// The color is in a compatible color space, and the variables
// `hue`, `saturation`, `brightness`, and `alpha` have been
// changed to contain these values.
}
请注意,此方法已启用
UIColor
。如果您有一个CGColor
引用,那么您必须创建一个UIColor
来读取它的hsba组件:UIColor(cgColor: yourCGColor)