Mascara una image y llena de color

Me gustaría enmascarar una image con un color y llenar tanto la selección como el rest. Estoy usando CGImageCreateWithMaskingColors , pero luego no sé cómo llenar la image con otro color.

Aquí está el comienzo de mi código

 UIImage *source = [UIImage imageNamed:@"nb.png"]; const CGFloat myMaskingColors[6] = {0,110,0,110,0,110}; CGImageRef imageRef = CGImageCreateWithMaskingColors(source.CGImage, myMaskingColors); UIImage* imageB = [UIImage imageWithCGImage:imageRef]; UIImageView *imageView = [[UIImageView alloc]initWithImage:imageB]; 

Gracias por tu ayuda EDITAR: Creo que no estaba claro, me gustaría un color para la selección y otro color para el rest

Si desea aplicar 2 colors en una image, puede aplicar gradiente en la image como esta

 - (UIImage *)applyGradientOnImage:(UIImage *)image withStartColor:(UIColor *)color1 endColor:(UIColor *)color2 { UIGraphicsBeginImageContextWithOptions(image.size, NO, image.scale); CGContextRef context = UIGraphicsGetCurrentContext(); CGContextTranslateCTM(context, 0, image.size.height); CGContextScaleCTM(context, 1.0, -1.0); CGContextSetBlendMode(context, kCGBlendModeNormal); CGRect rect = CGRectMake(0, 0, image.size.width, image.size.height); //CGContextDrawImage(context, rect, img.CGImage); // Create gradient NSArray *colors = [NSArray arrayWithObjects:(id)color2.CGColor, (id)color1.CGColor, nil]; CGColorSpaceRef space = CGColorSpaceCreateDeviceRGB(); CGGradientRef gradient = CGGradientCreateWithColors(space, (__bridge CFArrayRef)colors, NULL); // Apply gradient CGContextClipToMask(context, rect, image.CGImage); CGContextDrawLinearGradient(context, gradient, CGPointMake(0,0), CGPointMake(0, image.size.height), 0); UIImage *gradientImage = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); CGGradientRelease(gradient); CGColorSpaceRelease(space); return gradientImage; } 

Puede lograrlo aplicando gradiente de un solo color. El siguiente código hace lo mismo que necesitamos

 - (UIImage *)applyColor:(UIColor *)color toImage:(UIImage*)toImage{ UIGraphicsBeginImageContextWithOptions(toImage.size, NO, toImage.scale); CGContextRef context = UIGraphicsGetCurrentContext(); CGContextTranslateCTM(context, 0, toImage.size.height); CGContextScaleCTM(context, 1.0, -1.0); CGContextSetBlendMode(context, kCGBlendModeNormal); CGRect rect = CGRectMake(0, 0, toImage.size.width, toImage.size.height); //CGContextDrawImage(context, rect, img.CGImage); // Create gradient NSArray *colors = [NSArray arrayWithObjects:(id)color.CGColor, (id)color.CGColor, nil]; CGColorSpaceRef space = CGColorSpaceCreateDeviceRGB(); CGGradientRef gradient = CGGradientCreateWithColors(space, (__bridge CFArrayRef)colors, NULL); // Apply gradient CGContextClipToMask(context, rect, toImage.CGImage); CGContextDrawLinearGradient(context, gradient, CGPointMake(0,0), CGPointMake(0, toImage.size.height), 0); UIImage *colonetworkingImage = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); CGGradientRelease(gradient); CGColorSpaceRelease(space); return colonetworkingImage; } 

El problema que usted recibe es nulo, porque los parameters que envía son inválidos. Si abre la documentation de Apple, verá esto:

Componentes

Una matriz de componentes de color que especifica un color o range de colors para enmascarar la image. La matriz debe contener valores 2N {min 1 , max 1 , … min [N], max [N]} donde N es el número de componentes en el espacio de color de la image. Cada valor en los componentes debe ser un valor de muestra de image válido. Si la image tiene componentes de píxeles integers, entonces cada valor debe estar en el range [0 .. 2 ** bitsPerComponent – 1] (donde bitsPerComponent es el número de bits / componente de la image). Si la image tiene componentes de píxeles en coma flotante, cada valor puede ser cualquier número de coma flotante que sea un componente de color válido.

testing diferentes parameters como

 const float myMaskingColors[6] = {1.0, 1.0, 0.0, 0.0, 1.0, 1.0}; 

También encontré una Pregunta relacionada sobre SO.