6

我正在尝试将 NSColor 转换为 RGB,但它似乎给出了完全错误的结果:

NSColor *testColor = [NSColor colorWithCalibratedWhite:0.65 alpha:1.0];

const CGFloat* components = CGColorGetComponents(testColor.CGColor);
NSLog(@"Red: %f", components[0]);
NSLog(@"Green: %f", components[1]);
NSLog(@"Blue: %f", components[2]);
NSLog(@"Alpha: %f", CGColorGetAlpha(testColor.CGColor));

我回来了:红色 = 0.65 - 绿色 = 1.0 - 蓝色 = 0.0 并且 alpha 为 1.0 - 这导致颜色完全不同。(它应该是灰色的,现在是绿色的)。

难道我做错了什么?

4

7 回答 7

11

从 NSColor 中提取 RGBA 值:(Swift 3)

let nsColor:NSColor = NSColor.red
let ciColor:CIColor = CIColor(color: nsColor)!
print(ciColor.red)//1.0
print(ciColor.green)//0.0
print(ciColor.blue)//0.0
print(ciColor.alpha)//1.0 /*or use nsColor.alphaComponent*/

注意: NSColor.blackColor().redComponent 会使应用程序崩溃,但上面的代码不会

于 2015-12-06T08:42:12.753 回答
8

当我想将选择的颜色转换为十六进制时,我遇到了同样的问题。NSColor 组件值不正确。我设法通过您上面的评论解决了我的问题。

斯威夫特的例子:

let colorTest = NSColor.init(calibratedWhite: 0.65, alpha: 1.0)
let color = colorTest.usingColorSpace(NSColorSpace.deviceRGB) ?? colorTest
print(colorTest)
// NSCalibratedWhiteColorSpace 0.65 1
print(colorTest.colorSpace) 
// Generic Gray colorspace
print("red: \(color.redComponent) green:\(color.greenComponent) blue:\(color.blueComponent)") 
// red: 0.708725869655609 green:0.708725869655609 blue:0.708725869655609
于 2017-07-21T09:56:55.877 回答
7

您需要NSColorSpace首先使用对象将颜色转换为 RGB 颜色空间,然后您可以使用各种NSColor访问器方法获取组件

于 2013-03-28T13:20:37.307 回答
4

为一个NSColor * color

CGFloat red = [color redComponent];
CGFloat green = [color greenComponent];
CGFloat blue = [color blueComponent];
于 2013-03-28T13:22:44.177 回答
2

我过去曾使用过它,它对我有用。

    NSColorSpace *colorSpace = [NSColorSpace sRGBColorSpace];
    NSColor *testColor = [NSColor colorWithColorSpace:colorSpace components:SRGB];

    CGFloat red = [testColor redComponent];

    CGFloat green = [testColor greenComponent];

    CGFloat blue = [testColor blueComponent];
于 2013-03-28T13:23:54.517 回答
0

您必须先检查色彩空间

那么如果是 rgb 你可以使用

CGFloat red = [testColor redComponent];
...

对于灰度,您必须以不同方式转换它

CGFloat red = [testColor whiteComponent];
CGFloat blue = [testColor whiteComponent];
CGFloat green = [testColor whiteComponent];
于 2013-03-28T13:29:51.220 回答
0

这是一个安全的 Swift 5SKColor扩展,用于获取NSColoror的 RGB 组件UIColor。(注意SKColor只是基于平台的一个或另一个的类型别名。)

public extension SKColor {
    var sRGBAComponents: (red: CGFloat , green: CGFloat, blue: CGFloat, alpha: CGFloat) {
        #if os(iOS)
        let rgbColor = self // lolz no color conversion on iOS, but on iOS it'll respond to getRed(...) anyhow
        #elseif os(macOS)
        let rgbColor = usingColorSpace(.extendedSRGB) ?? SKColor(red: 1, green: 1, blue: 1, alpha: 1) // will return 'self' if already RGB
        #endif

        var red: CGFloat = 0, green: CGFloat = 0, blue: CGFloat = 0, alpha: CGFloat = 0
        rgbColor.getRed(&red, green: &green, blue: &blue, alpha: &alpha)
        return (red: red, green: green, blue: blue, alpha: alpha)
    }
}
于 2020-05-19T23:28:24.197 回答