Search code examples
iphoneobjective-ciosuiimagecgcontext

Changing UIImage color


I'm trying to change color of UIImage. My code:

-(UIImage *)coloredImage:(UIImage *)firstImage withColor:(UIColor *)color {
    UIGraphicsBeginImageContext(firstImage.size);

    CGContextRef context = UIGraphicsGetCurrentContext();
    [color setFill];

    CGContextTranslateCTM(context, 0, firstImage.size.height);
    CGContextScaleCTM(context, 1.0, -1.0);

    CGContextSetBlendMode(context, kCGBlendModeCopy);
    CGRect rect = CGRectMake(0, 0, firstImage.size.width, firstImage.size.height);
    CGContextDrawImage(context, rect, firstImage.CGImage);

    CGContextClipToMask(context, rect, firstImage.CGImage);
    CGContextAddRect(context, rect);
    CGContextDrawPath(context,kCGPathElementMoveToPoint);

    UIImage *coloredImg = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

    return coloredImg;
}

This code works, but obtained image is not so well as shoud be: bounds pixels of returned image are intermittent and not so smooth as in my first image. How can I resolve this problem?


Solution

  • Since iOS 7, this is the most simple way of doing it.

    Objective-C:

    theImageView.image = [theImageView.image imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate];
    [theImageView setTintColor:[UIColor redColor]];
    

    Swift 2.0:

    theImageView.image = theImageView.image?.imageWithRenderingMode(.AlwaysTemplate) 
    theImageView.tintColor = UIColor.magentaColor()
    

    Swift 4.0:

    theImageView.image = theImageView.image?.withRenderingMode(.alwaysTemplate) 
    theImageView.tintColor = .magenta
    

    Storyboard:

    First configure the image as template ( on right bar - Render as) in your assets. Then the color of the image would be the tint color applied. enter image description here