Ios 比较UIColors或CGColor或CGColorSpace

Ios 比较UIColors或CGColor或CGColorSpace,ios,uicolor,Ios,Uicolor,我在比较颜色时遇到了问题。我有一个图像,我已经成功地提取了用户单击的图像上的颜色。现在我想把这个颜色和其他颜色进行比较,但是我得到了一些奇怪的结果。以下是我尝试过的: CGColorRef pixelColor = [[buttonImage colorAtPixel:point] CGColor]; UIColor* color = [UIColor colorWithCGColor:pixelColor]; UIColor* aqua = [UIColor colorWithRed:

我在比较颜色时遇到了问题。我有一个图像,我已经成功地提取了用户单击的图像上的颜色。现在我想把这个颜色和其他颜色进行比较,但是我得到了一些奇怪的结果。以下是我尝试过的:

    CGColorRef pixelColor = [[buttonImage colorAtPixel:point] CGColor];
UIColor* color = [UIColor colorWithCGColor:pixelColor];
UIColor* aqua = [UIColor colorWithRed:0.521569 green:0.768627 blue:0.254902 alpha:1];
if (CGColorEqualToColor(color.CGColor, aqua.CGColor)) {
    DLog(@"Apparently, it works");
}
DLog(@"%@", color.CGColor);
DLog(@"%@", aqua.CGColor);
输出:

2011-05-21 19:48:27.144 Coffee[66860:207] -[DescriptorsViewController touchesEnded:withEvent:] <CGColor 0x4d1eb80> [<CGColorSpace 0x4d1a070> (kCGColorSpaceDeviceRGB)] ( 0.521569 0.768627 0.254902 1 )
2011-05-21 19:48:27.145 Coffee[66860:207] -[DescriptorsViewController touchesEnded:withEvent:] <CGColor 0x4d1f750> [<CGColorSpace 0x4d1a070> (kCGColorSpaceDeviceRGB)] ( 0.521569 0.768627 0.254902 1 )
同样的愚蠢也会发生

2011-05-21 20:02:49.277 Coffee[67013:207] -[DescriptorsViewController touchesEnded:withEvent:] <CGColor 0x4d3b810> [<CGColorSpace 0x5912010> (kCGColorSpaceDeviceRGB)] ( 0.521569 0.768627 0.254902 1 )
2011-05-21 20:02:49.278 Coffee[67013:207] -[DescriptorsViewController touchesEnded:withEvent:] <CGColor 0x4d3ba20> [<CGColorSpace 0x5912010> (kCGColorSpaceDeviceRGB)] ( 0.521569 0.768627 0.254902 1 )`
2011-05-21 20:02:49.277咖啡[67013:207]-[DescriptorsViewController touchesEnded:withEvent:][(KCGColorSpaceDeviceGB)](0.521569 0.768627 0.254902 1)
2011-05-21 20:02:49.278咖啡[67013:207]-[DescriptorsViewController touchesEnded:withEvent:][(kCGColorSpaceDeviceRGB)](0.521569 0.768627 0.254902 1)`

您可以使用以下方法获取和比较颜色空间:

CGColorSpaceModel aquaCm = CGColorSpaceGetModel(CGColorGetColorSpace([UIColor aquaColor].CGColor);
CGColorSpaceModel cm = CGColorSpaceGetModel(CGColorGetColorSpace(pixelColor);

if (aquaCm == cm) {
    //compare colors in the same colorspace here
}

对于不在同一颜色空间中的颜色,您可以将其转换为如图所示的适当颜色空间,或者因为您正在与系统颜色进行颜色比较,所以可以与使用
[uicolorWithred:green:blue:alpha://code>生成的颜色进行比较(这些颜色在RGB颜色空间中,最有可能是您的图像)

我只需要为它们创建UIColor对象,然后使用
-(BOOL)getRed:(CGFloat*)红绿:(CGFloat*)绿蓝:(CGFloat*)蓝alpha:(CGFloat*)alpha来获取组件并进行比较。请注意,根据其他颜色的来源,可能存在舍入误差,因此您可能希望要求每个颜色分量仅在+/-1/256.0范围内正确。对于
CGColor
,您可以使用函数
CGColorEqualToColor

bool CGColorEqualToColor (
   CGColorRef color1,
   CGColorRef color2
);

我也目睹了这个功能无法工作!有人向苹果报告过吗

我的解决方案是比较单个RGBA-下面是代码(我实现了一个类别,因此
self
是一个
UIColor

我还发现舍入误差可能导致直接比较CGFloat失败。所以我把它们都投给了ints

-(bool)isEqualToColor:(UIColor*)other
{
    CGFloat fLHS[4];
    CGFloat fRHS[4];

    [self getRed:&fLHS[0] green:&fLHS[1] blue:&fLHS[2] alpha:&fLHS[3]];
    [other getRed:&fRHS[0] green:&fRHS[1] blue:&fRHS[2] alpha:&fRHS[3]];

    // reduce rounding errors - convert all into int for compare
    for( int i=0;i<4;i++ )
    {
        if( ((int)(fLHS[i]*255))!=((int)(fRHS[i]*255)) )
            return false;
    }
    return true;
}
-(bool)isEqualToColor:(UIColor*)其他
{
CGFLHS[4];
CGFloat fRHS[4];
[自获取红色:&fLHS[0]绿色:&fLHS[1]蓝色:&fLHS[2]阿尔法:&fLHS[3];
[其他红色:&fRHS[0]绿色:&fRHS[1]蓝色:&fRHS[2]阿尔法:&fRHS[3];
//减少舍入错误-将all转换为int进行比较

对于(int i=0;i默认情况下,CGColorEqualToColor不起作用,如原始问题所示。我目前也有同样的问题。奇怪的是,它在iPhone 5及以下版本(模拟器和设备测试)上起作用,但在5s及以上版本(仅模拟器测试)上不起作用。
-(bool)isEqualToColor:(UIColor*)other
{
    CGFloat fLHS[4];
    CGFloat fRHS[4];

    [self getRed:&fLHS[0] green:&fLHS[1] blue:&fLHS[2] alpha:&fLHS[3]];
    [other getRed:&fRHS[0] green:&fRHS[1] blue:&fRHS[2] alpha:&fRHS[3]];

    // reduce rounding errors - convert all into int for compare
    for( int i=0;i<4;i++ )
    {
        if( ((int)(fLHS[i]*255))!=((int)(fRHS[i]*255)) )
            return false;
    }
    return true;
}