2011-05-22 13 views
14

Sto riscontrando un problema nel confronto di UIColors. Ho un'immagine, che ho estratto con successo il colore sull'immagine a cui l'utente ha fatto clic. Ora voglio confrontare quel colore con altri colori, ma sto ottenendo alcuni risultati strani. Ecco quello che ho provato:Confronto tra 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); 

uscita:

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) 

Sembra che gli indirizzi CGColor sono diversi, ma i CGColorSpaces sono gli stessi, ma non riesco a capire come confrontare il CGColorSpaces

inoltre ho provato questo:

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

si verifica lo stesso stupidità.

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

risposta

2

È possibile ottenere e confrontare spazi colore utilizzando il seguente:

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

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

Per i colori che non sono nello stesso spazio colore, è possibile convertirli lo spazio colore appropriato come illustrato in this question O dal momento che' facendo confronti con i colori del sistema, confrontati con i colori generati con [UIColor colorWithRed:green:blue:alpha:] (che sono nello spazio cromatico RGB, molto probabilmente quello che è l'immagine)

1

Mi piacerebbe solo creare oggetti UIColor per loro, quindi utilizzare -(BOOL)getRed:(CGFloat *)red green:(CGFloat *)green blue:(CGFloat *)blue alpha:(CGFloat *)alpha per ottenere i componenti e confrontare. Si noti che è possibile avere errori di arrotondamento, a seconda di dove provengono gli altri colori, quindi è necessario richiedere che ciascun componente del colore sia corretto solo entro +/- 1/256.0

16

Per CGColor è possibile utilizzare la funzione CGColorEqualToColor:

+0

Questo è tutto! Grazie ... – StefMa

+0

Purtroppo CGColorEqualToColor NON funziona, come mostrato nella domanda originale. Attualmente sto avendo lo stesso problema. La cosa strana è che funziona su iPhone 5 e versioni successive (simulatore e dispositivo testato), ma non su 5s e su (solo simulatore testato). – Dylan

4

Anch'io ho assistito a questa funzione non funziona! Qualcuno l'ha segnalato a Apple?

La mia soluzione era quella di confrontare RGBA individuale - ecco il codice (ho implementato un categoria, quindi self è un UIColor).

Ho anche riscontrato che gli errori di arrotondamento potrebbero rendere i confronti diretti con il fallimento di CGFloat. Quindi li ho trasmessi agli 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

Questo funziona correttamente per me. – jboulter11

+1

Ha funzionato. Grazie, fratello. – steveluoxin

Problemi correlati