2011-05-22 6 views
14

Tengo un problema al comparar UIColors. Tengo una imagen, que he extraído con éxito el color de la imagen en la que el usuario hizo clic. Ahora quiero comparar ese color con otros colores, pero obtengo algunos resultados extraños. Esto es lo que he intentado:Comparando UIColors o CGColor o CGColorSpace

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

Salida:

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) 

Parece que las direcciones CGColor son diferentes, pero los CGColorSpaces son los mismos, pero no puedo encontrar la manera de comparar la CGColorSpaces

también he intentado esto:

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

lo mismo ocurre estupidez.

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

Respuesta

2

Es posible obtener y comparar los espacios de color utilizando la siguiente:

CGColorSpaceModel aquaCm = CGColorSpaceGetModel(CGColorGetColorSpace([UIColor aquaColor].CGColor); 
CGColorSpaceModel cm = CGColorSpaceGetModel(CGColorGetColorSpace(pixelColor); 

if (aquaCm == cm) { 
    //compare colors in the same colorspace here 
} 

Para los colores que no están en el mismo espacio de color, puede convertirlos en el espacio de color apropiado como se ilustra in this question O ya que' haciendo comparaciones de colores con los colores del sistema, compárelo con los colores generados con [UIColor colorWithRed:green:blue:alpha:] (que están en el espacio de color RGB, muy probablemente cuál es su imagen)

1

Solo crearía objetos UIColor para ellos, luego use -(BOOL)getRed:(CGFloat *)red green:(CGFloat *)green blue:(CGFloat *)blue alpha:(CGFloat *)alpha para obtener los componentes y comparar. Tenga en cuenta que es posible tener errores de redondeo, dependiendo de dónde provengan los otros colores, por lo que es posible que desee solicitar que cada componente de color sea correcto dentro de +/- 1/256.0

16

Para CGColor puede usar la función CGColorEqualToColor:

bool CGColorEqualToColor (
    CGColorRef color1, 
    CGColorRef color2 
); 
+0

Eso es todo! Gracias ... – StefMa

+0

Desafortunadamente, CGColorEqualToColor NO funciona, como se muestra en la pregunta original. Actualmente estoy teniendo este mismo problema. Lo curioso es que SI FUNCIONA en el iPhone 5 y en versiones inferiores (simulador y dispositivo probado), pero no en 5s y superiores (el simulador solo se probó). – Dylan

4

¡Yo también he presenciado que esta función no funciona! ¿Alguien lo ha reportado a Apple?

Mi solución fue comparar RGBA individuo - aquí está el código (He implementado una categoría, por lo tanto, es un selfUIColor).

También encontré que los errores de redondeo pueden hacer que las comparaciones directas con el CGFloat fallen. Así que los he lanzado a 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; 
} 
+1

Esto funciona correctamente para mí. – jboulter11

+1

Funcionó. Gracias hermano. – steveluoxin