Ответ 1
Для CGColor
вы можете использовать функцию CGColorEqualToColor
:
bool CGColorEqualToColor (
CGColorRef color1,
CGColorRef color2
);
У меня проблема с сопоставлением 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
);
Я тоже засвидетельствовал, что эта функция не работает! Кто-нибудь сообщил об этом яблоку?
Мое решение заключалось в сравнении отдельных 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;
}
Вы можете получить и сравнить цветовые пространства, используя следующее:
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, скорее всего, ваше изображение)
Я бы просто создал для них объекты UIColor, а затем использовал -(BOOL)getRed:(CGFloat *)red green:(CGFloat *)green blue:(CGFloat *)blue alpha:(CGFloat *)alpha
для получения компонентов и сравнения. Обратите внимание, что возможно иметь ошибки округления, в зависимости от того, откуда идет другой цвет, поэтому вы можете потребовать, чтобы каждый компонент цвета был только правильным в пределах +/- 1/256.0