Last active
July 17, 2018 19:23
-
-
Save jlawton/9754617 to your computer and use it in GitHub Desktop.
CIFilter Blur
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// 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