Apple gives us very powerfull tools for processing images in Swift on all platforms. Framework
CoreImage provides many filters, effects, and blending options with lighting fast performance. It even can automatically enhance a photo!
CIImage is not really an image. This class has all information about the image, but it is not rendered. Think about it as instructions how to create the output.
CIFilter is responsible for image processing, Core Image have many built options, but we can write custom filters. Each filter have its own input parameters, but developer documentation is not very effective source of information. I found this app and this site. It contains all
CIFilter related informations with examples of usage and output.
CIContext is where magic happens, it is responsible for image analysis and rendering. It can even detect faces with
CIDetector. Everything with performance in mind.
I'll use Playgrounds for running code, you can check it out in iOS app or Mac app, or Playgrounds. Everything goes :)
The test subject
For purpouse of demonstration, and cuteness (very important) I'll use picture of my dogs:
CIImage object is simple, it can be produced from
UIImage or directly from file. I added my dogs to resources and loaded via URL. I'm creating
CIContext, it will be needed at the end.
import CoreImage let context = CIContext() let url = Bundle.main.url(forResource:"doggos", withExtension:"jpeg")! let ciImage = CIImage(contentsOf: url)
I want image to be black and white and make it look like instant photo. To make colors dissapear, I'll use
CIColorControls, and bring saturation to
0. For instant photo effect there is built in option -
CIPhotoEffectInstant. Every filter has input and input, but different parameters. Check them on website above.
Black and white
let blackAndWhiteFilter = CIFilter(name: "CIColorControls")! blackAndWhiteFilter.setValue(ciImage, forKey: "inputImage") blackAndWhiteFilter.setValue(0, forKey: kCIInputSaturationKey)
Instantify B&W image
We can chain filters. To do that, use output of first filter and pass as input to second one. How awesome is that? Core Image will produce combined effect by its own, no additional code required!
let instantFilter = CIFilter(name: "CIPhotoEffectInstant")! instantFilter.setValue(blackAndWhiteFilter.outputImage!, forKey: "inputImage")
Now final image:
I saved images as files. But if you want display them on iPhone screen, use convinient method for creating
let finalUIImage = UIImage(ciImage: finalImage)
With a little help of Core Image framework we can create stunning visuals and breathtaking effects. Feel free to explore more filters and see what you can achieve with your imagination and creativity!