I would like to apply a linear gradient to a photo using Core Image. Here is the code that I am using (or you can check it out in an Xcode project: http://cl.ly/2Z0Z2f1a3Q27):
CIContext *coreImageContext = [CIContext contextWithOptions:nil];
CIFilter *gradientFilter = [CIFilter filterWithName:@"CILinearGradient"];
[gradientFilter setDefaults];
CIColor *startColor = [CIColor colorWithCGColor:[UIColor yellowColor].CGColor];
CIColor *endColor = [CIColor colorWithCGColor:[UIColor blackColor].CGColor];
CIVector *startVector = [CIVector vectorWithX:100 Y:0];
CIVector *endVector = [CIVector vectorWithX:100 Y:100];
[gradientFilter setValue:startVector forKey:@"inputPoint0"];
[gradientFilter setValue:endVector forKey:@"inputPoint1"];
[gradientFilter setValue:startColor forKey:@"inputColor0"];
[gradientFilter setValue:endColor forKey:@"inputColor1"];
UIImage *originalImage = [UIImage imageNamed:@"testImage.jpeg"];
CIImage *ciImage = [CIImage imageWithCGImage:originalImage.CGImage];
[gradientFilter setValue:ciImage forKey:kCIInputImageKey];
CIImage *resultCIImage = [gradientFilter valueForKey:kCIOutputImageKey];
CGImageRef resultCGImage = [coreImageContext createCGImage:resultCIImage fromRect:[resultCIImage extent]];
UIImage *resultUIImage = [UIImage imageWithCGImage:resultCGImage scale:[[UIScreen mainScreen] scale] orientation:UIImageOrientationUp];
CGImageRelease(resultCGImage);
UIImageView *filteredImageView = [[UIImageView alloc] initWithImage:resultUIImage];
Running this code on the device (iPhone 5, iOS 6.0.1) and simulator (iOS 6) produces an exception:
Terminating app due to uncaught exception 'NSUnknownKeyException', reason: '[<CILinearGradient 0x1f857ee0> setValue:forUndefinedKey:]: this class is not key value coding-compliant for the key inputImage.'
The line that the exception is occurring is [gradientFilter setValue:ciImage forKey:kCIInputImageKey].
Here is a sample Xcode project that you can build to see this error: http://cl.ly/2Z0Z2f1a3Q27
CILinearGradient only has the four properties – two points and two colors. You would have to chain a CILinearGradient with a CISourceOverCompositing filter to composite a gradient over an image. See filter reference:
https://developer.apple.com/library/mac/documentation/graphicsimaging/reference/CoreImageFilterReference/Reference/reference.html#//apple_ref/doc/filter/ci/CILinearGradient