2010-04-07 62 views
1

假设我已经获得了红色的FF0000颜色。找到一个更深的颜色很容易,我只是键入可能CC而不是FF,但是假设我已经获得了颜色AE83FC,这是一个复杂的颜色,我怎么会发现自动更轻或更暗的版本?Objective-C RGB到HSB

我想最简单的方式做,这是我的RGB转换为HSB [色调,饱和度,亮度]

我将如何做到这一点在Objective-C?

假设我有一个RGB:1.0,0.0,0.0。那是红色的。

CGFloat r = 1.0; 
CGFloat g = 0.0; 
CGfloat b = 0.0; 

我将如何将其转换成HSB然后变换颜色,并使其回到RGB到我可以使用CGContextRGBSetFillColor?

有没有HSB功能?

请帮忙。 :)

回答

4

首先,请注意,三个数字不描述颜色,三个数字连同一个颜色空间。 RGB不是一个色彩空间,它就是所谓的色彩模型。 RGB模型有很多颜色空间。因此((1,0,0),sRGB)与((1,0,0),Adobe RGB)颜色不同。你知道字符串编码是如何工作的吗?一堆字节本身不是一个字符串?这很像。这也是类似的,因为无论何时您想查看组件值,都会遇到麻烦,因为这是搞乱色彩空间处理的机会。

对不起,不能帮助自己。无论如何,我会回答这个问题,就好像你的原始颜色是((1,0,0),通用RGB)。

NSColor *color = [NSColor colorWithCalibratedRed:1 green:0 blue:0 alpha:1]; 
NSLog(@"hue! %g saturation! %g brightness! %g, [color hueComponent], [color saturationComponent], [color brightnessComponent]); 

,并在另一方面,

NSColor *color = [NSColor colorWithCalibratedHue:h saturation:s brightness:b alpha:1]; 
NSLog(@"red! %g green! %g blue! %g, [color redComponent], [color greenComponent], [color blueComponent]); 

这些fooComponent方法并非适用于所有颜色的工作,只有那些在两个特定的色彩空间,看文档。你已经知道你很好,如果你用上面的方法自己创建颜色。如果你有一个未知来源的颜色,你可以(尝试)将它转换成一个颜色空间,你可以在这个颜色空间中使用这些组合方法-[NSColor colorUsingColorspaceName:]

+0

啊,真好。 :)感谢很多人。我假设整个Adobe RGB和sRGB不会是一个大问题,因为iPhone使用了特定的颜色类型? – 2010-04-07 09:12:29

0

有没有必要一路去HSB这一点。如果要查找较暗的颜色版本,只需将每个R,G和B分量与0到1之间的数字相乘,即可得到相同的颜色,但颜色较深。

实施例:AE83FC的半强度:

{0xAE, 0x83, 0xFC} * 0.5 = 
    {174, 131, 252} * 0.5 = 
    {87, 65, 126} = 
    {0x57, 0x41, 0x7E} => 57417E 

以相同的方式,可以通过与任何东西> 1乘以获得更亮的版本。每个组件的值不能大于255,因此发生这种情况时,您需要将其限制为255.这意味着该颜色不会是完全相同颜色的较亮版本,但可能足够满足您的需要。

+0

不错的方法!我从来没有想过它那样:) – 2010-04-07 09:10:39

+0

这是一个非常粗略的近似值,并会倾向于给你明显的颜色漂移,除了最受限制的情况 – Cruachan 2011-06-28 21:18:50