swift - 查找 UIColor 的色调、饱和度、亮度和 alpha

标签 swift xcode colors rgb uicolor

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

但事实并非如此

最佳答案

为什么你得到“错误”的组件值

您会发现 components CGColor 的值是颜色颜色空间中组件的值。因为有 no hue-saturation-brighness-alpha color space model ,这些不会是颜色的色调饱和度或亮度。

相反,您可能会在 RGB 颜色空间模型(如 UIColor.red)中找到颜色的红-绿-蓝-alpha 值或在单色颜色空间模型(如 UIColor.gray)。

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),这些值不是色调、饱和度、亮度和 alpha,这是有道理的——因为任何带有 0 的颜色亮度将完全变黑,任何饱和度为 0 的颜色都将完全去饱和。

相反,我们希望 red 的亮度和饱和度都为 100%,就像它们在颜色选择器中的显示方式一样:

the HSB values in the color picker for "red"

如何获取颜色的色调、饱和度、亮度和透明度

如果您想获得颜色的色调、饱和度、亮度和 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) 

关于swift - 查找 UIColor 的色调、饱和度、亮度和 alpha,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47387478/

相关文章:

android - 颜色的十六进制透明度

javascript - 使用 D3 根据背景更改文本颜色

ios - 如何以编程方式使用 UIView autoresizingMask 属性?

json - Swift 使用参数初始化类,然后在不使用参数的情况下初始化它

ios - 您可以为 iOS 构建动态库并在运行时加载它们吗?

ios - Swift 4 - 抛出函数的无效转换

ios - 更改设备方向,swift,iOS,

ios - 截取当前 View (包括键盘)的屏幕截图 Swift 4

xcode - PromiseKit 分支 promise