首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >比较UIColors、CGColor或CGColorSpace

比较UIColors、CGColor或CGColorSpace
EN

Stack Overflow用户
提问于 2011-05-22 11:04:49
回答 4查看 11.2K关注 0票数 15

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

代码语言:javascript
复制
    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);

输出:

代码语言:javascript
复制
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

我也尝试过这个:

代码语言:javascript
复制
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);

同样愚蠢的事情也会发生。

代码语言:javascript
复制
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 )`
EN

回答 4

Stack Overflow用户

发布于 2013-02-01 18:56:45

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

代码语言:javascript
复制
bool CGColorEqualToColor (
   CGColorRef color1,
   CGColorRef color2
);
票数 17
EN

Stack Overflow用户

发布于 2015-06-10 02:59:23

我也见证了这个函数不起作用!有没有人向苹果报告过?

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

我还发现,舍入误差可能会导致与CGFloat的直接比较失败。所以我把它们转换成整数。

代码语言:javascript
复制
-(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;
}
票数 4
EN

Stack Overflow用户

发布于 2011-11-19 09:31:27

您可以使用以下内容获取和比较色彩空间:

代码语言:javascript
复制
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所示,或者由于您正在与系统颜色进行颜色比较,因此可以与[UIColor colorWithRed:green:blue:alpha:]生成的颜色进行比较(RGB色空间中的颜色,很可能是您的图像)

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6085783

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档