【问题标题】:Objective-C RGB to HSBObjective-C RGB 转 HSB
【发布时间】:2010-04-07 08:43:32
【问题描述】:

假设我有颜色 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功能?

请帮忙。 :)

【问题讨论】:

    标签: iphone objective-c colors rgb hsb


    【解决方案1】:

    首先,请注意,三个数字不能描述一种颜色,三个数字加上一个色彩空间可以。 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:] 的这些组件方法。

    【讨论】:

    • 啊,不错不错。 :) 非常感谢人。我假设整个 Adob​​e RGB 和 sRGB 不会是一个大问题,因为 iPhone 使用特定的颜色类型?
    【解决方案2】:

    没有必要为此一路去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。这意味着颜色不会完全是相同颜色的更亮版本,但可能足够接近您的目的。

    【讨论】:

    • 好方法!我从来没有这样想过:)
    • 这是一个非常粗略的近似值,除了最有限的情况外,在所有情况下都会给您带来明显的颜色漂移
    猜你喜欢
    • 2012-07-27
    • 2011-05-05
    • 2014-04-29
    • 2015-03-11
    • 1970-01-01
    • 1970-01-01
    • 2012-01-03
    • 2014-02-02
    相关资源
    最近更新 更多