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