2011-05-22 36 views
14

Tôi gặp sự cố khi so sánh UIColors. Tôi có một hình ảnh, mà tôi đã trích xuất thành công màu sắc trên hình ảnh mà người dùng đã nhấp vào. Bây giờ tôi muốn so sánh màu đó với các màu khác, nhưng tôi nhận được một số kết quả lạ. Đây là những gì tôi đã cố gắng:So sánh UIColors hoặc CGColor hoặc 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); 

Output:

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) 

Dường như các địa chỉ CGColor là khác nhau, nhưng CGColorSpaces đều giống nhau, nhưng tôi không thể tìm ra cách để so sánh CGColorSpaces

tôi cũng đã thử điều này:

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

Các dại tương tự xảy ra.

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

Trả lời

2

Bạn có thể nhận và so sánh colorspaces sử dụng như sau:

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

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

Đối với màu sắc mà không phải là trong không gian màu tương tự, bạn có thể chuyển đổi chúng sang không gian màu thích hợp như minh họa in this question HOẶC kể từ khi bạn' đang thực hiện so sánh màu với màu hệ thống, so sánh với màu được tạo với [UIColor colorWithRed:green:blue:alpha:] (có màu RGB, rất có thể hình ảnh của bạn là gì)

1

Tôi chỉ tạo đối tượng UIColor cho chúng, sau đó sử dụng -(BOOL)getRed:(CGFloat *)red green:(CGFloat *)green blue:(CGFloat *)blue alpha:(CGFloat *)alpha để có được các thành phần và so sánh. Lưu ý rằng có thể có lỗi làm tròn, tùy thuộc vào vị trí của các màu khác, do đó bạn có thể yêu cầu mỗi thành phần màu chỉ đúng trong +/- 1/256.0

16

Đối với CGColor bạn có thể sử dụng hàm CGColorEqualToColor:

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

Vậy đó! Cảm ơn bạn ... – StefMa

+0

Thật không may CGColorEqualToColor KHÔNG hoạt động, như được hiển thị trong câu hỏi gốc. Tôi hiện đang gặp vấn đề tương tự. Điều kỳ lạ là nó làm việc trên iPhone 5 trở xuống (giả lập và thử nghiệm thiết bị), nhưng không phải trên 5s & up (giả lập chỉ được thử nghiệm). – Dylan

4

Tôi cũng đã chứng kiến ​​chức năng này không hoạt động! Có ai đã báo cáo về quả táo không?

Giải pháp của tôi là so sánh RGBA riêng lẻ - đây là mã (tôi đã triển khai loại, do đó selfUIColor).

Tôi cũng phát hiện ra rằng lỗi làm tròn có thể so sánh trực tiếp với lỗi CGFloat. Vì vậy, tôi đã cast chúng thành 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

Công trình này phù hợp với tôi. – jboulter11

+1

Nó hoạt động. Cảm ơn bạn. – steveluoxin

Các vấn đề liên quan