Add a semi-transparent layer to UIImage using Core Graphics

836 views Asked by At

I need to take a UIImage and to add a semi-transparent layer in order to produce a new UIImage. I think I'm getting close but something is still wrong. Here's my code:

- (UIImage*) addLayerTo:(UIImage*)source
{
    CGSize size = [source size];
    UIGraphicsBeginImageContext(size);
    CGRect rect = CGRectMake(0, 0, size.width, size.height);
    [source drawInRect:rect blendMode:kCGBlendModeNormal alpha:0.18];

    CGContextRef context = UIGraphicsGetCurrentContext();
    CGContextSetRGBStrokeColor(context, 0.2, 0.5, 0.1, 0.18);
    CGContextFillRect(context, rect);
    UIImage *testImg =  UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    return testImg;
}
2

There are 2 answers

0
Jan Cássio On BEST ANSWER

You forgot to draw the current image you want to blend with source image in current context.

- (UIImage*) addLayerTo:(UIImage*)source
{
  CGSize size = [source size];
  UIGraphicsBeginImageContext(size, NO, [UIScreen mainScreen].scale); // Use this image context initialiser instead

  CGRect rect = CGRectMake(0, 0, size.width, size.height);
  [self drawInRect: rect] // Draw the current image in context
  [source drawInRect:rect blendMode:kCGBlendModeNormal alpha:0.18]; // Blend with other image

  CGContextRef context = UIGraphicsGetCurrentContext();
  CGContextSetRGBStrokeColor(context, 0.2, 0.5, 0.1, 0.18);
  CGContextFillRect(context, rect);
  UIImage *testImg =  UIGraphicsGetImageFromCurrentImageContext();
  UIGraphicsEndImageContext();
  return testImg;

}

0
Nat On
- (UIImage*) addLayerTo:(UIImage*)source
{
    CGSize size = [source size];
    // create context with UIScrean scale
    UIGraphicsBeginImageContextWithOptions(size, NO, 0.0);
    // get new context
    CGContextRef ctx1 = UIGraphicsGetCurrentContext();
    // draw view
    CGContextDrawImage(ctx1, CGRectMake(0.0f, 0.0f, size.width, size.height), source.CGImage);
    // set fill color
    UIColor *fillColor = [UIColor purpleColor];
    // fill with it
    CGContextSetFillColorWithColor(ctx1, fillColor.CGColor);
    CGContextFillRect(ctx1, CGRectMake(0, 0, size.width, size.height));

    // create new image
    UIImage *outputImage = UIGraphicsGetImageFromCurrentImageContext();
    // end context
    UIGraphicsEndImageContext();

    return outputImage;
}