# Tinting an image

I have an image which is a black ring:

black ring http://imageshack.us/a/img51/2029/blackcb.png

In my view, I need to display it as a white ring. So, to tint the image, I have written the below method:

- (UIImage *)getRingImage
{
UIImage *ringImage = [UIImage imageNamed:@"ring"];

CGFloat scale = [[UIScreen mainScreen] scale];

UIGraphicsBeginImageContext(CGSizeMake(ringImage.size.width * scale, ringImage.size.height * scale));

CGContextRef ctx = UIGraphicsGetCurrentContext();
CGRect rect = CGRectMake(0, 0, ringImage.size.width * scale, ringImage.size.height * scale);

// Converting a UIImage to a CGImage flips the image,
// so apply a upside-down translation
CGContextScaleCTM(ctx, 1, -1);
CGContextTranslateCTM(ctx, 0, -rect.size.height);

// Set the fill color space
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
CGContextSetFillColorSpace(ctx, colorSpace);

// Set the mask to only tint non-transparent pixels
CGContextClipToMask(ctx, rect, ringImage.CGImage);

// Set the fill color
CGContextSetFillColorWithColor(ctx, [UIColor colorWithRed:1.0f green:1.0f blue:1.0f alpha:1].CGColor);

UIRectFillUsingBlendMode(rect, kCGBlendModeColor);

ringImage = UIGraphicsGetImageFromCurrentImageContext();

CGColorSpaceRelease(colorSpace);
UIGraphicsEndImageContext();

return ringImage;
}


This code works fine. I want to know if there is a better way to do this.

• What do you mean by "better?" – Robert Harvey May 14 '13 at 18:05
• By "better" I mean, use of a different API which could achieve the same result but in less number of steps which in turn could lead to reduced execution time and CPU cycles. – Munish Poonia May 14 '13 at 18:14
• I doubt it. Even when it took you 20 steps, the code is simple. If you are interested in other blend modes see robots.thoughtbot.com/post/46668544473/… – Jano May 14 '13 at 19:53

## 1 Answer

Try this function that I adapted. It creates a mono-color "mask" from an input image. If you use white, it turns every non-transparent pixel to white:

- (UIImage*)convertToMask: (UIImage *) image
{
UIGraphicsBeginImageContextWithOptions(image.size, NO, image.scale);
CGRect imageRect = CGRectMake(0.0f, 0.0f, image.size.width, image.size.height);

CGContextRef ctx = UIGraphicsGetCurrentContext();

// Draw a white background (for white mask)
CGContextSetRGBFillColor(ctx, 1.0f, 1.0f, 1.0f, 1.0f);
CGContextFillRect(ctx, imageRect);

// Apply the source image's alpha
[image drawInRect:imageRect blendMode:kCGBlendModeDestinationIn alpha:1.0f];

UIImage* outImage = UIGraphicsGetImageFromCurrentImageContext();

UIGraphicsEndImageContext();

return outImage;
}


Used like this:

self.imageView.image = [self convertToMask:self.imageView.image];