Search code examples
iosimageviewmaskblur

applying a mask to a blurView in iOS


I have an image that I am trying to apply a stack blur to and would like to apply a mask from a .png file I created to see the clear image below. I need image below to be able to be changed out at given times but the blurView with mask to remain static. This is my code I am using but I do not get the masked image in the blur.

  - (void)viewDidLoad
    {
        [super viewDidLoad];

    UIImageView *imageview = [UIImageView new];
    [imageview setFrame:[self.view bounds]];
    [imageview setAutoresizingMask:UIViewAutoresizingFlexibleWidth|UIViewAutoresizingFlexibleHeight];
    [imageview setImage:[UIImage imageNamed:@"myImage.jpg"]];
    [imageview setContentMode:UIViewContentModeScaleAspectFill];
    [self.view addSubview:imageview];

    [self setBlurView:[AMBlurView new]];
    [[self blurView] setFrame:CGRectMake(0.f, 0.f, [self.view bounds].size.width, [self.view bounds].size.height)];
    [[self blurView] setAutoresizingMask:UIViewAutoresizingFlexibleWidth|UIViewAutoresizingFlexibleHeight];

    [self.view addSubview:[self blurView]];

    imageview.image = [self maskImage:imageview.image withMask:[UIImage imageNamed:@"mask"]];

}

- (UIImage*) maskImage:(UIImage *)image withMask:(UIImage *)maskImage {

    CGImageRef imgRef = [image CGImage];
    CGImageRef maskRef = [maskImage CGImage];
    CGImageRef actualMask = CGImageMaskCreate(CGImageGetWidth(maskRef),
                                              CGImageGetHeight(maskRef),
                                              CGImageGetBitsPerComponent(maskRef),
                                              CGImageGetBitsPerPixel(maskRef),
                                              CGImageGetBytesPerRow(maskRef),
                                              CGImageGetDataProvider(maskRef), NULL, false);
    CGImageRef masked = CGImageCreateWithMask(imgRef, actualMask);
    return [UIImage imageWithCGImage:masked];

}

Solution

  • Try this cocoa controls for Blur Image

    COCOA CONTROL

    UpDated Answer

    - (void)viewDidLoad
        {
            [super viewDidLoad];
    
        UIImageView *imageview = [UIImageView new];
        [imageview setFrame:[self.view bounds]];
        [imageview setAutoresizingMask:UIViewAutoresizingFlexibleWidth|UIViewAutoresizingFlexibleHeight];
        [imageview setImage:[UIImage imageNamed:@"myImage.jpg"]];
        [imageview setContentMode:UIViewContentModeScaleAspectFill];
     imageview.image = [self maskImage:imageview.image withMask:[UIImage imageNamed:@"mask"]];
        [self.view addSubview:imageview];
    
        [self setBlurView:[AMBlurView new]];
        [[self blurView] setFrame:CGRectMake(0.f, 0.f, [self.view bounds].size.width, [self.view bounds].size.height)];
        [[self blurView] setAutoresizingMask:UIViewAutoresizingFlexibleWidth|UIViewAutoresizingFlexibleHeight];
    
        [self.view addSubview:[self blurView]];
    
    
    
    }
    
    - (UIImage*) maskImage:(UIImage *)image withMask:(UIImage *)maskImage {
    
        CGImageRef imgRef = [image CGImage];
        CGImageRef maskRef = [maskImage CGImage];
        CGImageRef actualMask = CGImageMaskCreate(CGImageGetWidth(maskRef),
                                                  CGImageGetHeight(maskRef),
                                                  CGImageGetBitsPerComponent(maskRef),
                                                  CGImageGetBitsPerPixel(maskRef),
                                                  CGImageGetBytesPerRow(maskRef),
                                                  CGImageGetDataProvider(maskRef), NULL, false);
        CGImageRef masked = CGImageCreateWithMask(imgRef, actualMask);
        return [UIImage imageWithCGImage:masked];
    
    }