2011-05-22 75 views
14

我在比較UIColors時遇到問題。我有一個圖像,我已經成功地提取用戶點擊圖像上的顏色。現在我想將這種顏色與其他顏色進行比較,但我得到了一些奇怪的結果。以下是我已經試過:比較UIColors或CGColor或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); 

輸出:

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

回答

2

您可以獲取和使用比較色彩空間以下內容:

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顏色空間中,很可能是您的圖像所生成的顏色)進行比較

1

我只是爲它們創建UIColor對象,然後使用-(BOOL)getRed:(CGFloat *)red green:(CGFloat *)green blue:(CGFloat *)blue alpha:(CGFloat *)alpha獲取組件並進行比較。請注意,根據其他顏色的來源可能會有舍入誤差,因此您可能希望要求每個顏色成分在+/- 1/256.0範圍內均正確。

16

對於CGColor您可以使用函數CGColorEqualToColor

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

就是這樣!謝謝...... – StefMa 2014-12-15 09:20:06

+0

不幸的是,CGColorEqualToColor不起作用,如原始問題所示。我目前有這個相同的問題。奇怪的是,它可以在iPhone 5及更低版本(模擬器和設備測試)上工作,但不適用於5s及以上(僅測試模擬器)。 – Dylan 2015-04-15 18:39:22

4

我也目睹了這個功能失效!有人向蘋果報告過嗎?

我的解決方案是比較單獨的RGBA - 這是代碼(我實現了類別,因此selfUIColor)。

我還發現四捨五入錯誤可能會導致與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; 
} 
+1

這適用於我。 – jboulter11 2015-06-25 16:10:10

+1

它工作。多謝兄弟。 – steveluoxin 2017-12-22 06:17:19