将NSColor转换为RGB

8
我正在尝试将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,透明度为1.0,这导致颜色完全不同(应该是灰色,现在是绿色)。

我做错了什么吗?

7个回答

11

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

let nsColor: NSColor = .red
let ciColor: CIColor = .init(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 会导致应用程序崩溃,但上面的代码不会。


9

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

Swift示例:

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

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

2
这也行不通,因为颜色不在RGB颜色空间中。你需要先进行转换,使用colorUsingColorSpaceName:函数。 - omz
1
是的,这会导致应用程序崩溃。 - user429620
5
完整的解决方案如下: NSColor *testColor = [[NSColor colorWithCalibratedWhite:0.65 alpha:1.0] colorUsingColorSpace:[NSColorSpace deviceRGBColorSpace]];该代码的功能是创建一个名为testColor的颜色对象,其灰度值为0.65,不透明度为1.0,并使用设备RGB颜色空间进行颜色转换。 - user429620

4
对于一个 NSColor * color
CGFloat red = [color redComponent];
CGFloat green = [color greenComponent];
CGFloat blue = [color blueComponent];

5
很抱歉,由于初始化的颜色不在RGB颜色空间中,所以我担心这会导致应用程序崩溃。 - user429620
1
你是否设置了色彩空间:NSColorSpace *sRGB = [NSColorSpace sRGBColorSpace]; 然后在该空间中创建了 NSColor - danielrsmith
你应该编辑你的回答,因为不设置colorSpace会导致崩溃。 - vomi

2
我以前使用过这个,对我有用。
    NSColorSpace *colorSpace = [NSColorSpace sRGBColorSpace];
    NSColor *testColor = [NSColor colorWithColorSpace:colorSpace components:SRGB];

    CGFloat red = [testColor redComponent];

    CGFloat green = [testColor greenComponent];

    CGFloat blue = [testColor blueComponent];

1
很遗憾,这会导致应用程序崩溃,因为初始化的颜色不在RGB颜色空间中。 - user429620

0

首先,您必须检查颜色空间

然后,如果是rgb,您可以使用

CGFloat red = [testColor redComponent];
...

对于灰度图像,您需要以不同的方式进行转换

CGFloat red = [testColor whiteComponent];
CGFloat blue = [testColor whiteComponent];
CGFloat green = [testColor whiteComponent];

0
这是一个安全的Swift 5 SKColor扩展,用于获取NSColorUIColor的RGB组件。(请注意,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)
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接