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 で、アルファは 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 に答える
7

最初にオブジェクトを使用して色を RGB 色空間に変換する必要があります。次に、さまざまなアクセサー メソッドNSColorSpaceを使用してコンポーネントを取得できます。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 コンポーネントを取得するための安全な Swift 5SKColor拡張機能を次に示します。(注意は、プラットフォームに基づいて、どちらか一方の typealias にすぎません。)NSColorUIColorSKColor

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 に答える
0

最初に色空間を確認する必要があります

それがrgbの場合は、使用できます

CGFloat red = [testColor redComponent];
...

グレースケールの場合は、別の方法で変換する必要があります

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