Skip to content

Instantly share code, notes, and snippets.

@jlawton
Last active July 17, 2018 19:23
Show Gist options
  • Save jlawton/9754617 to your computer and use it in GitHub Desktop.
Save jlawton/9754617 to your computer and use it in GitHub Desktop.
CIFilter Blur
// Fix for https://github.com/bryanjclark/ios-darken-image-with-cifilter
-(instancetype)darkened:(CGFloat)alpha andBlurredImage:(CGFloat)radius blendModeFilterName:(NSString *)blendModeFilterName {
CIImage *inputImage = [[CIImage alloc] initWithImage:self];
CIContext *context = [CIContext contextWithOptions:nil];
//First, create some darkness
CIFilter* blackGenerator = [CIFilter filterWithName:@"CIConstantColorGenerator"];
CIColor* black = [CIColor colorWithRed:0.0f green:0.0f blue:0.0f alpha:alpha];
[blackGenerator setValue:black forKey:@"inputColor"];
CIImage* blackImage = [blackGenerator valueForKey:@"outputImage"];
//Second, apply that black
CIFilter *compositeFilter = [CIFilter filterWithName:blendModeFilterName];
[compositeFilter setValue:blackImage forKey:@"inputImage"];
[compositeFilter setValue:inputImage forKey:@"inputBackgroundImage"];
CIImage *darkenedImage = [compositeFilter outputImage];
// JAL: Extend the image to infinity
CGAffineTransform transform = CGAffineTransformIdentity;
CIFilter *clampFilter = [CIFilter filterWithName:@"CIAffineClamp"];
[clampFilter setValue:inputImage forKey:kCIInputImageKey];
[clampFilter setValue:[NSValue valueWithBytes:&transform objCType:@encode(CGAffineTransform)] forKey:@"inputTransform"];
CIImage *infiniteImage = [clampFilter outputImage];
//Third, blur the image
CIFilter *blurFilter = [CIFilter filterWithName:@"CIGaussianBlur"];
[blurFilter setDefaults];
[blurFilter setValue:@(radius) forKey:@"inputRadius"];
[blurFilter setValue:infiniteImage forKey:kCIInputImageKey];
CIImage *blurredImage = [blurFilter outputImage];
// JAL: Make sure you're using the extents of the non-infinite input image as your rect
CGImageRef cgimg = [context createCGImage:blurredImage fromRect:inputImage.extent];
UIImage *blurredAndDarkenedImage = [UIImage imageWithCGImage:cgimg];
CGImageRelease(cgimg);
return blurredAndDarkenedImage;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment