比较UIColors或CGColor或CGColorSpace

我有一个比较UIColors的问题。 我有一个图像,我已经成功地提取用户点击图像上的颜色。 现在我想比较这种颜色与其他颜色,但我得到了一些奇怪的结果。 以下是我所尝试的:

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 ) 

它看起来像CGColor地址是不同的,但CGColorSpaces是相同的,但我不知道如何比较CGColorSpaces

我也试过这个:

 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 ([color isEqual:aqua]) { DLog(@"Apparently, it works"); } DLog(@"%@", color.CGColor); DLog(@"%@", aqua.CGColor); 

同样的愚蠢发生。

 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 )` 

对于CGColor您可以使用CGColorEqualToColor函数:

 bool CGColorEqualToColor ( CGColorRef color1, CGColorRef color2 ); 

我也亲眼目睹了这个function失效! 有人向苹果报告过吗?

我的解决scheme是比较个人的RGBA – 这里的代码(我实现了一个类别 ,因此self是一个UIColor )。

我还发现,舍入错误可能会使CGFloat直接比较失败。 所以我把它们投入了整数。

 -(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; } 

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

 CGColorSpaceModel aquaCm = CGColorSpaceGetModel(CGColorGetColorSpace([UIColor aquaColor].CGColor); CGColorSpaceModel cm = CGColorSpaceGetModel(CGColorGetColorSpace(pixelColor); if (aquaCm == cm) { //compare colors in the same colorspace here } 

对于不在同一个颜色空间中的颜色,可以将它们转换为适当的颜色空间,如本问题所示,或者由于您正在使用系统颜色进行颜色比较,请与[UIColor colorWithRed:green:blue:alpha:] (这是在RGB色彩空间,最有可能是你的形象是什么)

-(BOOL)getRed:(CGFloat *)red green:(CGFloat *)green blue:(CGFloat *)blue alpha:(CGFloat *)alpha 。 请注意,可能会舍入误差,这取决于其他颜色的来源,所以您可能希望要求每个颜色分量在+/- 1 / 256.0之间正确