Сравнение UIColors или CGColor или CGColorSpace - PullRequest
14 голосов
/ 22 мая 2011

У меня проблема со сравнением 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 )`

Ответы [ 4 ]

16 голосов
/ 01 февраля 2013

Для CGColor вы можете использовать функцию CGColorEqualToColor:

bool CGColorEqualToColor (
   CGColorRef color1,
   CGColorRef color2
);
4 голосов
/ 09 июня 2015

Я тоже был свидетелем того, как эта функция не работает! Кто-нибудь сообщал об этом яблоку?

Мое решение состояло в том, чтобы сравнить отдельные 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 голосов
/ 19 ноября 2011

Вы можете получить и сравнить цветовые пространства, используя следующее:

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, скорее всего, ваше изображение)

1 голос
/ 19 ноября 2011

Я бы просто создал для них объекты UIColor, а затем использовал -(BOOL)getRed:(CGFloat *)red green:(CGFloat *)green blue:(CGFloat *)blue alpha:(CGFloat *)alpha, чтобы получить компоненты и сравнить.Обратите внимание, что возможны ошибки округления в зависимости от того, откуда поступают другие цвета, поэтому вы можете потребовать, чтобы каждый компонент цвета был корректным только в пределах +/- 1 / 256.0

...