amcastror
amcastror

Reputation: 568

iOS create UIImage using a mask and a UIColor

I'm currently coloring an existing image using a mask. For example, I have a white image with a black border and a circular mask (like the first two images). Then, I can create a third image with a color (i.e. green) which has green on the center of the original image (because the mask is present there).

enter image description here enter image description here enter image description here

The code I'm using is this (suggestions welcomed):

-(UIImage *)paintWithMask:(UIImage *)mask color:(UIColor *)color andSize:(CGSize)size{

    UIImage *image = self;
    UIImage *rotatedMask = [self rotateImage:mask]; //For some reason this is needed.

    UIGraphicsBeginImageContextWithOptions(size, NO, image.scale);

    CGRect rect = CGRectMake(0.0f, 0.0f, size.width, size.height);
    [image drawInRect:rect];

    CGContextRef context = UIGraphicsGetCurrentContext();
    CGContextSetBlendMode(context, kCGBlendModeSourceIn);

    CGContextSetFillColorWithColor(context, color.CGColor);
    CGContextClipToMask(context, rect, [rotatedMask CGImage]);
    CGContextFillRect(context, rect);

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

    return coloredImage;
}

What I need to do now is paint the green circle using only the mask (without the black border obviously), like this:

enter image description here enter image description here

Any ideas? Thanks a lot!!

Upvotes: 0

Views: 476

Answers (1)

gram
gram

Reputation: 26

There is a much easier way of doing this without CoreGraphics. Simply do the following:

-(UIImageView *)imageViewWithMask:(UIImage *)mask color:(UIColor *)color andSize:(CGSize)size{
    UIImage *tempImage = mask;
    tempImage = [tempImage imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate];
    UIGraphicsBeginImageContextWithOptions(size, NO,0);
    [tempImage drawInRect: CGRectMake(0,0,size.width,size.height)];
    tempImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    UIImageView *iv = [[UIImageView alloc] initWithImage: tempImage];
    iv.tintColor = color;
    return iv;
}

Upvotes: 1

Related Questions