我正在尝试将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 - 这导致了完全不同的颜色。 (它应该是灰色的,现在它是绿色的)。
我做错了吗?
答案 0 :(得分:6)
对于NSColor * color
CGFloat red = [color redComponent];
CGFloat green = [color greenComponent];
CGFloat blue = [color blueComponent];
答案 1 :(得分:5)
首先需要使用NSColorSpace
对象将颜色转换为RGB颜色空间,然后使用各种NSColor
存取方法获取组件
答案 2 :(得分:5)
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会使应用程序崩溃,但上面的代码不会
答案 3 :(得分:3)
当我想将拾取的颜色转换为十六进制时,我遇到了同样的问题。 NSColor组件值不正确。我设法通过上面的comment解决了我的问题。
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
答案 4 :(得分:1)
我过去曾经使用过它,它对我有用。
NSColorSpace *colorSpace = [NSColorSpace sRGBColorSpace];
NSColor *testColor = [NSColor colorWithColorSpace:colorSpace components:SRGB];
CGFloat red = [testColor redComponent];
CGFloat green = [testColor greenComponent];
CGFloat blue = [testColor blueComponent];
答案 5 :(得分:1)
这是一个安全的Swift 5 SKColor
扩展名,用于获取NSColor
或UIColor
的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)
}
}
答案 6 :(得分:0)
你必须先检查颜色空间
然后如果它是rgb你可以使用
CGFloat red = [testColor redComponent];
...
对于灰度,您必须以不同方式进行转换
CGFloat red = [testColor whiteComponent];
CGFloat blue = [testColor whiteComponent];
CGFloat green = [testColor whiteComponent];