首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Objective-C RGB到HSB

Objective-C RGB到HSB
EN

Stack Overflow用户
提问于 2010-04-07 16:43:32
回答 2查看 5K关注 0票数 1

假设我得到了红色的FF0000颜色。找到更深的颜色很容易,我只需要输入可能的CC而不是FF,但假设我得到了颜色AE83FC,这是一个复杂的颜色,我怎么才能自动找到它的更亮或更暗的版本?

我想最简单的方法就是把我的RGB转换成HSB色调,饱和度,亮度

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

假设我得到的RGB是: 1.0,0.0,0.0。那是红色的。

代码语言:javascript
复制
CGFloat r = 1.0;
CGFloat g = 0.0;
CGfloat b = 0.0;

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

有没有HSB函数?

请帮帮忙。:)

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-04-07 16:56:46

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

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

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

另一方面,

代码语言:javascript
复制
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:]中使用那些组件方法。

票数 4
EN

Stack Overflow用户

发布于 2010-04-07 17:08:40

没有必要为此一直使用HSB。如果你想找到更深的颜色版本,只需将每个R,G和B分量相乘,得到0到1之间的数字,你就会得到相同的颜色,但更暗。

示例:AE83FC的半强度:

代码语言:javascript
复制
  {0xAE, 0x83, 0xFC} * 0.5 =
  {174, 131, 252} * 0.5 =
  {87, 65, 126} =
  {0x57, 0x41, 0x7E} => 57417E

同样,你可以通过乘以任何大于1的值来获得更亮的版本。每个分量的值不能大于255,因此当发生这种情况时,您需要将其限制为255。这意味着颜色不会完全是相同颜色的更亮版本,但可能足够接近您的目的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2591013

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档