NSColor | 从RGB值创建颜色

8
在我的应用程序中,我将获得 RGB 值作为无符号字符,因此它不会超过 255, 我正在使用 NSColor API 创建颜色,并将利用它来绘制字体和背景颜色。
这是我编写的函数。
+(NSColor *)getColorFromRGB:(unsigned char)r blue:(unsigned char)b green:(unsigned char)g
{
    CGFloat rFloat = r/255.0;
    CGFloat gFloat = g/255.0;
    CGFloat bFloat = b/255.0;

    //  return [NSColor colorWithCalibratedRed:((float)r/255.0) green:((float)g/255.0) blue:((float)b/255.0) alpha:1.0];
    return [NSColor colorWithCalibratedRed:rFloat green:gFloat blue:bFloat alpha:1.0];
}

在几乎所有的情况下,当我使用RGB调色板中的RGB值进行颜色比较时,颜色并不匹配。

例如,当我传递:

r = 187, g = 170, b = 170,

它应该绘制浅灰色,但我得到的是完全白色,这种情况下,有人知道我做错了什么吗?

顺祝商祺

Rohan


你确定你的显示器已经进行了颜色校准吗? - Aurum Aquila
你传递输入组件时使用的是哪个比例尺?是255吗? - spd
3个回答

11
代码对我来说有效。尝试进行调试,你是否记得在创建颜色后调用-set方法?这是一些有效的示例代码:
static NSColor *colorFromRGB(unsigned char r, unsigned char g, unsigned char b)
{
    return [NSColor colorWithCalibratedRed:(r/255.0f) green:(g/255.0f) blue:(b/255.0f) alpha:1.0];
}

...

- (void)drawRect:(NSRect)rect {
    NSColor *c = colorFromRGB(50, 100, 255);
    [c set]; // <-- Important
    NSRectFill(rect);
}

谢谢Dietrich,我犯了同样的错误:( - Amitg2k12
更好的方法是,如果您可以将此colorFromRGBA函数添加一个double a参数,并将其分配给alpha:值。 - Volomike

5
如果你的输入组件超过了255,为了安全起见,你可以尝试将其限制在255以内,方法如下:
CGFloat rFloat = r % 255.0; CGFloat gFloat = g % 255.0; CGFloat bFloat = b % 255.0;
不要使用除法,而是使用取模运算符%。

安全与此无关。使用“%”将产生超出范围的值,因为“+colorWithCalibratedRed:green:blue:alpha”方法接受0-1范围内的值。 - Dietrich Epp
在我的回答中,我提到如果您传递的输入值超过255,然后如果您想将其限制在255之间,请使用%。此外,%255不会给出超出范围的值。例如,177%255将给出177。 - spd

3

Swift 2中的扩展

您可以使用此扩展,该扩展接受来自Photoshop、Sketch等软件的RGB值(0-255),并返回适当的NSColor实例(请注意,某些源代码行比此处显示的更宽):

extension NSColor {

// returns color instance from RGB values (0-255)
static func fromRGB(red: Double, green: Double, blue: Double, alpha: Double = 100.0) -> NSColor {

    let rgbRed = CGFloat(red/255)
    let rgbGreen = CGFloat(green/255)
    let rgbBlue = CGFloat(blue/255)
    let rgbAlpha = CGFloat(alpha/100)

    let color = NSColor(red: rgbRed, green: rgbGreen, blue: rgbBlue, alpha: rgbAlpha)
    return color
}

示例用法:

let myColor = NSColor.fromRGB(140, green: 150, blue: 155)
let mySemiTranspColor = NSColor.fromRGB(140, green: 150, blue: 155, alpha: 50)

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