我在比较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 )`
答案 0 :(得分:16)
对于CGColor
,您可以使用函数CGColorEqualToColor
:
bool CGColorEqualToColor (
CGColorRef color1,
CGColorRef color2
);
答案 1 :(得分:4)
我也目睹了这个功能无法正常工作!有没有人把它报告给苹果?
我的解决方案是比较单个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;
}
答案 2 :(得分:2)
您可以使用以下方法获取和比较颜色空间:
CGColorSpaceModel aquaCm = CGColorSpaceGetModel(CGColorGetColorSpace([UIColor aquaColor].CGColor);
CGColorSpaceModel cm = CGColorSpaceGetModel(CGColorGetColorSpace(pixelColor);
if (aquaCm == cm) {
//compare colors in the same colorspace here
}
对于不在同一颜色空间中的颜色,您可以将它们转换为适当的颜色空间,如图所示in this question或者,因为您正在使用系统颜色进行颜色比较,请与使用{{1}生成的颜色进行比较}(在RGB颜色空间中,很可能是你的图像)
答案 3 :(得分:1)
我只是为它们创建UIColor对象,然后使用-(BOOL)getRed:(CGFloat *)red green:(CGFloat *)green blue:(CGFloat *)blue alpha:(CGFloat *)alpha
来获取组件并进行比较。请注意,可能会出现舍入错误,具体取决于其他颜色的来源,因此您可能希望要求每个颜色组件仅在+/- 1 / 256.0