使用RGB值创建NSColor

16

我该如何根据RGB值创建一个NSColor对象?

4个回答

18

根据NSColor文档:

NSColor *myColor = [NSColor colorWithCalibratedRed:redValue green:greenValue blue:blueValue alpha:1.0f];

3
你应该使用1.0f而不是1.0,因为1.0是一个double类型,在iPhone上不是本地类型。 - nash
5
需要翻译的内容:It's probably worth making it clear that the color values are from 0.0 to 1.0.另外,需要明确一下颜色值是从0.0到1.0。需要翻译的内容:Also, the "calibrated" version is indeed more than likely the correct variant of this method to use. You want to use the NSCalibratedRGBColorSpace (which corresponds to [NSColorSpace genericRGBColorSpace]) in all internal dealings with colors. And only use the "device" color spaces variants when outputting to a known specific device.此外,“校准”版本很可能是使用此方法的正确变体。您应该在处理颜色的所有内部交易中使用NSCalibratedRGBColorSpace(对应于[NSColorSpace genericRGBColorSpace])。仅在输出到已知特定设备时才使用“设备”颜色空间变量。 - Kelan
4
@nash - 在 iPhone 上没有 NSColor 类型,NSColor 是 OSX 上 Cocoa 框架的一部分。 - Marin Todorov
请注意,在现代硬件上,指定颜色空间可能非常重要——例如,在默认的sRGB空间中,红色分量为1.0的颜色比新款Mac显示器支持的Display P3空间中的红色分量为1.0的颜色更少。使用NSColor的新初始化程序明确指定您正在使用哪个空间。 - rickster

12

此外,不要忘记进行以下转换,从您获得的实际RGB值(比如来自Photoshop)...

RGB值为(226, 226, 226)可以使用以下数值在NSColor中实例化:

Red:   226/255 = 0.886... 
Green: 226/255 = 0.886...
Blue:  226/255 = 0.886... 

[NSColor colorWithDeviceRed:0.886f green:0.886f blue:0.886f alpha:1.0f];

为什么是255?8位色道的颜色范围在0到255(含)之间。当归一化后,该范围缩放至[0,1](含)。有关从归一化值到非归一化值以及反之的转换,请参阅参考资料。

参考资料


2
这对其他人可能很明显,但为什么要加1呢?只是因为256是一个更好的数字来进行除法运算,有更多的因数,从而减少舍入误差/小数点吗? - DJH
这个答案有点错误。8位RGB颜色分量值的范围是0到255,总共有256个值。因此,将其映射到从0到1的RGB值的正确方法是除以255,即:red = 226 / 255。添加看起来很奇怪的1并除以256会得到非常相似但略微不正确的结果,您可以通过考虑如果颜色分量为0会发生什么来验证这一点:零除以255仍然是零,但(0 + 1) / 256 > 0。 - davidf2281

4
float red = 0.5f;
float green = 0.2f;
float blue = 0.4f;
float alpha = 0.8f;

NSColor *rgb = [NSColor colorWithDeviceRed:red green:green blue:blue alpha:alpha];

-3

Swift 2的扩展

extension NSObject {
    func RGB(r:CGFloat, g:CGFloat, b:CGFloat, alpha:CGFloat? = 1) -> NSColor {
        return NSColor(red: r/255, green: g/255, blue: b/255, alpha: alpha!)
    }
}

然后只需调用

RGB(r: 16, g: 105, b: 125)

或者

RGB(r: 16, g: 105, b: 125, alpha: 0.5)

1
为什么要创建NSObject的扩展而不是NSColor的扩展? - Emma Labbé
但如果您创建NSObject的扩展,您需要像这样调用函数:NSObject().RGB(_:, g:, b:)或任何NSObject子类。 - Emma Labbé
是的,但仅在NSObject子类内部,因此只能在Objective-C类中使用,而不能在纯Swift类、全局函数或顶层代码中使用。此外,您可以在不命名“r”参数的情况下调用该函数。 - Emma Labbé

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