将RGB值转换为UIColor?

时间:2013-05-15 21:10:35

标签: ios objective-c algorithm ios6 colors

给定一个巨大的RGB值列表,我想将它们与标准UIColor相关联。例如,(255,0,0)是“常见”红色。我想将像(254,85​​,44)和(193,0,1)这样的值配对并标记为“红色”。只要它们接近红色的阴影,我想说它是“红色”。实现这一目标的最佳方法是什么?我尝试测试亮度,甚至将它与通用公式的标准(255,0,0)进行比较但是没有成功。有什么建议吗?

4 个答案:

答案 0 :(得分:5)

基本上与@frowing所说的相同,但我还有一些#defined宏让我的生活更轻松:

#define RGB(R, G, B)                        ([UIColor colorWithRed:R/255.0f green:G/255.0f blue:B/255.0f alpha:1.0f])
#define G(W)                                ([UIColor colorWithWhite:W/255.0f alpha:1.0f])
#define RGBA(R, G, B, A)                    ([UIColor colorWithRed:R/255.0f green:G/255.0f blue:B/255.0f alpha:A])
#define GA(W, A)                            ([UIColor colorWithWhite:W/255.0f alpha:A])
#define RANDCOLOR                           ([UIColor colorWithHue:fmodf(((float)arc4random()/0x100000000)+0.618033988749895f, 1.0f) saturation:0.75f brightness:0.95f alpha:1.0f]) // From http://martin.ankerl.com/2009/12/09/how-to-create-random-colors-programmatically/
#define RANDCOLOR_ALPHA(A)                  ([UIColor colorWithHue:fmodf(((float)arc4random()/0x100000000)+0.618033988749895f, 1.0f) saturation:0.75f brightness:0.95f alpha:A]) // From http://martin.ankerl.com/2009/12/09/how-to-create-random-colors-programmatically/
  • RGB(R,G,B)用于简单的RGB到UIColor转换
  • G(W)用于灰色空间中的简单UIColor
  • RGBA(R,G,B,A)与RGB()相同但具有指定的Alpha通道
  • GA(W,A)与G()相同,但具有指定的alpha通道
  • RANDCOLOR()只是一种随机颜色(有关为什么这不仅仅是每个RGB值的随机数的详细信息,请参阅链接)
  • RANDCOLOR_ALPHA(A)与RANDCOLOR()相同但具有指定的Alpha通道

编辑1 :我错误地读了你的问题。我的错。

我会从一组您想要用作标签的已定义颜色开始。例如:

#define COLOR_RED RGB(193.0f, 0.0f, 1.0f)

然后,我将使用rgb进行rgb计算,以确定颜色在3d空间中的距离。如下所示:

const float* rgb1 = CGColorGetComponents( color1.CGColor );
const float* rgb2 = CGColorGetComponents( color2.CGColor );
double diff = pow(pow(rgb2[0] - rgb1[0], 2) + pow(rgb2[1] - rgb1[1], 2) + pow(rgb2[2] - rgb1[2], 2), 0.5);

为结果选择一个阈值,将其写入函数,迭代标签(或标签数组和相应的UIColors),并返回diff低于某个阈值的标签。

有一点需要注意,这是假设您的颜色都在RGB颜色空间中。只有当您的颜色位于RGB颜色空间时,CGColorGetComponents才会返回RGB。灰度颜色将返回不同的值(rgb1和rgb2的大小不同)。

编辑2 :好的,我从旧教科书做了一些研究,你想要使用的颜色数据称为L * a * b颜色空间。

来自http://en.wikipedia.org/wiki/Lab_color_space

  

与RGB和CMYK颜色模型不同,Lab颜色设计为   近似人类视觉。

我首先将RGB值转换为L * a * b空间,然后在上面列出的rgb值的相同3d空间距离计算中使用l,a,b值。这被称为CIE76算法(它不是最好的,但可能是更容易实现的算法之一...请参阅下面的注释)。这个数值差异值应该让您接近理解两种颜色与人眼的相似之处。然后根据一些测试,我会选择一个你觉得舒服的阈值。

为了将RGB转换为L * a * b,我找到了这个页面:http://cookbooks.adobe.com/post_Useful_color_equations__RGB_to_LAB_converter-14227.html

注意:这基本上是获得色差的最快(尽管有点脏)。我说脏了,因为那里有更复杂的算法,在颜色谱的更饱和的一端不会失真。如果您想查看更新的算法,请查看此维基百科:http://en.wikipedia.org/wiki/Color_difference

答案 1 :(得分:5)

您最好的选择是将RBG值转换为HSL或HSV(有时称为HSB)。然后检查色调值。如果色调在0-15或340-360范围内出现(调整这些范围以适合您自己的“红色”定义),那么您可以将颜色视为红色。当然,其中一些将近乎黑色或白色,你也可能也想限制亮度或亮度值。

int red = ... // your red value (0 - 255)
int green = ... // your green value (0 - 255)
int blue = ... // your blue value (0 - 255)
UIColor *RGBColor = [UIColor colorWithRed:red / 255.0 green:green / 255.0 blue:blue / 255.0  alpha:1.0];
CGFloat hue, saturation, brightness;
if ([RGBColor getHue:&hue saturation:&saturation brightness:&brightness alpha:nil]) {
    // Replace 15 and 240 with values you consider to be "red"
    if (hue < 15/360.0 || hue > 240/360.0) {
        // this can be considered "red"
    }
} else {
    // oops - can't convert
}

答案 2 :(得分:3)

如果要将RGB转换为UIColor,可以使用这两个内联函数:

#define RGB(r, g, b) [UIColor colorWithRed:r/255.0 green:g/255.0 blue:b/255.0 alpha:1]
#define RGBA(r, g, b, a) [UIColor colorWithRed:r/255.0 green:g/255.0 blue:b/255.0 alpha:a]

然后像这样使用它们:

UIColor *color = RGB(100,100,100);

答案 3 :(得分:-1)

为UIColor + RGB创建类别。

在.h

#import <UIKit/UIKit.h>

@interface UIColor (RGB)


+(UIColor *)colorWithRedInt:(NSInteger)red greenInt:(NSInteger)green blueInt:(NSInteger)blue alpha:(CGFloat)alpha;
+(UIColor *)commonTextColor;
+(UIColor *)tabBarColor;

@end

<强> in.m

#import "UIColor+RGB.h"

@implementation UIColor (NormalizedRGB)

+(UIColor *)colorWithRedInt:(NSInteger)red greenInt:(NSInteger)green blueInt:(NSInteger)blue alpha:(CGFloat)alpha
{
    return [self colorWithRed:red/256.0 green:green/256.0 blue:blue/256.0 alpha:1.0];
}
@end