Преобразование NSColor в RGB

Я пытаюсь преобразовать 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 - что приводит к совершенно другому цвету. (Он должен быть серым, теперь он зеленый).

Я делаю что-то неправильно?


person Community    schedule 28.03.2013    source источник


Ответы (7)


Вам необходимо преобразовать цвет в цветовое пространство RGB с помощью _ 1_ сначала объект, затем вы можете получить компоненты, используя различные _ 2_ методы доступа

person Dan F    schedule 28.03.2013
comment
Это также не сработает, потому что цвет не находится в цветовом пространстве RGB. Вам нужно сначала преобразовать его, используя colorUsingColorSpaceName:. - person omz; 28.03.2013
comment
Да, это приводит к сбою приложения. - person ; 28.03.2013
comment
Спасибо, решение полностью: NSColor * testColor = [[NSColor colorWithCalibratedWhite: 0.65 alpha: 1.0] colorUsingColorSpace: [NSColorSpace deviceRGBColorSpace]]; - person ; 28.03.2013

Извлечение значений RGBA из NSColor: (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 приведет к сбою приложения, но приведенный выше код - не

person Sentry.co    schedule 06.12.2015

У меня была такая же проблема, когда я хотел преобразовать выбранный цвет в шестнадцатеричный. Значения компонентов 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
person Atika    schedule 21.07.2017

Для NSColor * color

CGFloat red = [color redComponent];
CGFloat green = [color greenComponent];
CGFloat blue = [color blueComponent];
person danielrsmith    schedule 28.03.2013
comment
Я боюсь, что это приведет к сбою приложения, поскольку инициализированный цвет не находится в цветовом пространстве RGB. - person ; 28.03.2013
comment
Вы установили цветовое пространство: NSColorSpace *sRGB = [NSColorSpace sRGBColorSpace];, а затем создали NSColor в этом пространстве? - person danielrsmith; 28.03.2013
comment
Вам следует отредактировать свой ответ, потому что не установка colorSpace приведет к сбою. - person vomi; 10.04.2020

Я использовал это в прошлом, и у меня это сработало.

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

    CGFloat red = [testColor redComponent];

    CGFloat green = [testColor greenComponent];

    CGFloat blue = [testColor blueComponent];
person Hunter Mitchell    schedule 28.03.2013
comment
Я боюсь, что это приведет к сбою приложения, поскольку инициализированный цвет не находится в цветовом пространстве RGB. - person ; 28.03.2013

Сначала вы должны проверить цветовое пространство

тогда, если это rgb, вы можете использовать

CGFloat red = [testColor redComponent];
...

Для оттенков серого вы должны преобразовать его по-другому

CGFloat red = [testColor whiteComponent];
CGFloat blue = [testColor whiteComponent];
CGFloat green = [testColor whiteComponent];
person KIDdAe    schedule 28.03.2013

Вот безопасное расширение Swift 5 SKColor для получения компонентов RGB для NSColor или 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)
    }
}
person Wil Shipley    schedule 19.05.2020