Objective-C RGB到HSB

时间:2010-04-07 08:43:32

标签: iphone objective-c colors rgb hsb

假设我的颜色是FF0000,它是红色的。找到一个更暗的颜色很容易,我只是键入CC而不是FF,但是假设我有AE83FC的颜色,这是一个复杂的颜色,我怎么会自动找到更亮或更暗的颜色呢? / p>

我认为简单的方法是将我的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功能吗?

请帮忙。 :)

2 个答案:

答案 0 :(得分:4)

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

抱歉,不禁自己。无论如何,我会回答这个问题,好像你的原始颜色是((1,0,0),Generic 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:]这些组件方法。

答案 1 :(得分: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.这意味着颜色不一定是相同颜色的更亮的版本,但可能足够接近你的目的。