iOS: ¿Cómo puedo determinar el color más frecuente en un CGRect dentro de una UIView?

Me gustaría implementar un método que, dado un CGRect dentro de una UIView, devuelve el color más usado en ese rectángulo.

He leído respuestas a preguntas similares y he revisado la documentation de Apple para comprender el código que figura en esas respuestas y el resultado final es un gran dolor de cabeza.

Le agradecería que alguien le explicara cómo hacerlo.

ACTUALIZAR

Logré crear una function de trabajo al extender el método colorAtPixel demostrado en el enlace de rojkarc. Estoy bastante seguro de que esto no es tan eficiente como podría. Si alguien tiene sugerencias para mejorarlo, estaría muy agradecido.

- (UIColor *) dominantColorInRect:(CGRect)rect { UIColor * dominantColor = nil; NSMutableDictionary * dictionary = [[NSMutableDictionary alloc] init]; int bytesPerPixel = 4; int bytesPerRow = bytesPerPixel * 1; NSUInteger bitsPerComponent = 8; unsigned char pixelData[4] = { 0, 0, 0, 0 }; CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); CGContextRef context = CGBitmapContextCreate(pixelData, 1, 1, bitsPerComponent, bytesPerRow, colorSpace, kCGImageAlphaPremultipliedLast); for (int x = rect.origin.x; x <= rect.size.width; x++) { for (int y = 0; y <= rect.size.height; y++) { context = CGBitmapContextCreate(pixelData, 1, 1, bitsPerComponent, bytesPerRow, colorSpace, kCGImageAlphaPremultipliedLast); CGContextTranslateCTM(context, -x, -y); [self.layer renderInContext:context]; CGContextRelease(context); UIColor *color = [UIColor colorWithRed:pixelData[0]/255.0 green:pixelData[1]/255.0 blue:pixelData[2]/255.0 alpha:pixelData[3]/255.0]; if (color) { NSInteger count = [[dictionary objectForKey:color] integerValue]; count++; [dictionary setObject:[NSNumber numberWithInt:count] forKey:color]; } } } CGColorSpaceRelease(colorSpace); int highestFrequency = 0; for (id color in dictionary) { NSInteger count = [[dictionary objectForKey:color] integerValue]; //NSInteger count = [object[1] integerValue]; if (count > highestFrequency) { highestFrequency = count; dominantColor = color; } } return dominantColor; } 

El siguiente algorithm:

  1. cree una image png desde la UIView dentro del rect (el código se ve a continuación)
  2. Tienes que iterar a través de la image (vertical y horisontal)
  3. Tienes que crear un histogtwig de color:

Para crear un histogtwig de color, debe get el color de un píxel en una location determinada (como aquí: http://www.markj.net/iphone-uiimage-pixel-color/ ) Y de lo que debe contar (y recoger) la frecuencia de un color determinado.

Crear image:

 if(UIGraphicsBeginImageContextWithOptions != NULL){ UIGraphicsBeginImageContextWithOptions(self.view.layer.frame.size, NO, 0.0); }else { UIGraphicsBeginImageContext(self.view.layer.frame.size); } [self.view.layer renderInContext:UIGraphicsGetCurrentContext()]; img = UIGraphicsGetImageFromCurrentImageContext(); size_t imageSize = CGImageGetBytesPerRow(img.CGImage) * CGImageGetHeight(img.CGImage); NSLog(@"imageSize: %zu",(imageSize/(1024*1024))); UIGraphicsEndImageContext(); 

Crear histogtwig: Google it, hay un montón de código pseudocódigo / objective-C disponible.