【问题标题】:Convert NSColor to RGB将 NSColor 转换为 RGB
【发布时间】:2020-05-20 07:28:24
【问题描述】:

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

我做错了吗?

【问题讨论】:

    标签: objective-c cocoa nscolor


    【解决方案1】:

    从 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 会使应用程序崩溃,但上面的代码不会

    【讨论】:

      【解决方案2】:

      当我想将选择的颜色转换为十六进制时,我遇到了同样的问题。 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
      

      【讨论】:

        【解决方案3】:

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

        【讨论】:

        • 这也不起作用,因为颜色不在 RGB 颜色空间中。你必须先转换它,使用colorUsingColorSpaceName:
        • 是的,这会使应用程序崩溃。
        • 感谢完整的解决方案是: NSColor *testColor = [[NSColor colorWithCalibratedWhite:0.65 alpha:1.0] colorUsingColorSpace:[NSColorSpace deviceRGBColorSpace]];
        【解决方案4】:

        对于NSColor * color

        CGFloat red = [color redComponent];
        CGFloat green = [color greenComponent];
        CGFloat blue = [color blueComponent];
        

        【讨论】:

        • 恐怕这会使应用程序崩溃,因为初始化的颜色不在 RGB 颜色空间中。
        • 您是否设置了色彩空间:NSColorSpace *sRGB = [NSColorSpace sRGBColorSpace];,然后在该空间中创建了NSColor
        • 你应该编辑你的答案,因为不设置颜色空间会导致崩溃。
        【解决方案5】:

        我以前用过这个,它对我有用。

            NSColorSpace *colorSpace = [NSColorSpace sRGBColorSpace];
            NSColor *testColor = [NSColor colorWithColorSpace:colorSpace components:SRGB];
        
            CGFloat red = [testColor redComponent];
        
            CGFloat green = [testColor greenComponent];
        
            CGFloat blue = [testColor blueComponent];
        

        【讨论】:

        • 恐怕这会使应用程序崩溃,因为初始化的颜色不在 RGB 颜色空间中。
        【解决方案6】:

        你必须先检查色彩空间

        如果是 rgb 你可以使用

        CGFloat red = [testColor redComponent];
        ...
        

        对于灰度,您必须进行不同的转换

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

        【讨论】:

          【解决方案7】:

          这是一个安全的 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)
              }
          }
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2015-02-10
            • 1970-01-01
            • 1970-01-01
            • 2012-04-11
            • 2017-03-11
            • 2016-06-27
            相关资源
            最近更新 更多