查找CAShapeLayer.fillColour的色调,饱和度,亮度和alpha

时间:2017-11-20 08:06:43

标签: swift xcode colors rgb uicolor

我有一个红色物体:     red_object = UIColor.red.cgColor

我想得到这个'红色'的色调饱和度亮度和alpha参数,这样我就可以使用更具体的参数重新编码我的红色和对象。

这项练习将是一次性的,但我需要这些参数。

我尝试过cgColor.components,但我不认为这是正确的功能:

public static <T> Predicate<T> distinctByKey(Function<? super T,Object> keyExtractor) {
    Map<Object,Boolean> seen = new ConcurrentHashMap<>();
    return t -> seen.putIfAbsent(keyExtractor.apply(t), Boolean.TRUE) == null;
}

BigDecimal totalShare = orders.stream()
    .filter(distinctByKey(o -> o.getCompany().getId()))
    .map(Order::getShare)
    .reduce(BigDecimal.ZERO, BigDecimal::add);

但如果我运行以下

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

但它不是

1 个答案:

答案 0 :(得分:3)

为什么你会得到错误的&#34;组件值

您会发现LEID的{​​{3}}是颜色空间中组件的值。由于有components,因此这些不会是颜色的饱和度或亮度。

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

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 )的组件值,有意义的是这些不是色调,饱和度,亮度和alpha - 因为0亮度的任何颜色都是完全黑色的,任何饱和度为0的颜色都会完全去饱和。

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

the HSB values in the color picker for "red"

如何获得颜色的色调,饱和度,亮度和alpha

如果你想得到颜色的色调,饱和度,亮度和颜色 - 无论颜色空间如何 - 你都要使用red并将四个可变指针传递给{{1值:

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来阅读其HSBA组件:

CGColor