我有一个红色的物体:
红色对象=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

但事实并非如此

最佳答案

为什么你得到了“错误的”组件值
你会发现acomponentsCGColor是颜色空间中组件的值。因为存在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)

10-04 21:06