1

假设我有颜色 FF0000,它是红色的。找到较深的颜色很容易,我可能只输入 CC 而不是 FF,但是假设我有颜色 AE83FC,这是一种复杂的颜色,我怎么会自动找到它的较浅或较深的版本?

我认为最简单的方法是将我的 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

2 回答 2

4

首先,请注意三个数字不能描述颜色,三个数字和颜色空间一起描述。RGB 不是色彩空间,而是所谓的色彩模型。RGB 模型有很多色彩空间。所以 ((1,0,0), sRGB) 是不同于 ((1,0,0), Adob​​e 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:].

于 2010-04-07T08:56:46.437 回答
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

In the same way, you can obtain brighter versions by multiplying with anything >1. The value of each component can't be larger than 255, so when that happens, you need to limit it to 255. That means that the color wont be exactly a brighter version of the same color, but probably close enough for your purposes.

于 2010-04-07T09:08:40.107 回答