Swift Framework CoreImage
Main Idea
Just like Core Data is Apple’s built-in framework for manipulating data, Core Image is their framework for manipulating images. This isn’t drawing, or at least for the most part it isn’t drawing, but instead it’s about changing existing images: applying sharpening, blurs, vignettes, pixellation, and more. If you ever used all the various photo effects available in Apple’s Photo Booth app, that should give you a good idea of what Core Image is good for!
// Follow instructions here: https://www.hackingwithswift.com/books/ios-swiftui/integrating-core-image-with-swiftui
// Integrating Core Image with SwiftUI
import CoreImage
import CoreImage.CIFilterBuiltins
import SwiftUI
struct ContentView: View {
@State private var image: Image?
var body: some View {
VStack {
image?
.resizable()
.scaledToFit()
}
.onAppear(perform: loadImage)
}
func loadImage() {
guard let inputImage = UIImage(named: "Example") else { return }
let beginImage = CIImage(image: inputImage)
let context = CIContext()
// SepiaTone
// let currentFilter = CIFilter.sepiaTone()
// currentFilter.inputImage = beginImage
// currentFilter.intensity = 1
// Pixellate
// let currentFilter = CIFilter.pixellate()
// currentFilter.inputImage = beginImage
// currentFilter.scale = 100
// Crystal Effect
// let currentFilter = CIFilter.crystallize()
// currentFilter.inputImage = beginImage
// currentFilter.radius = 200
//
// Twirl Distortion
// let currentFilter = CIFilter.twirlDistortion()
// currentFilter.inputImage = beginImage
// currentFilter.radius = 1000
// currentFilter.center = CGPoint(x: inputImage.size.width / 2, y: inputImage.size.height / 2)
// Any
let currentFilter = CIFilter.twirlDistortion()
currentFilter.inputImage = beginImage
let amount = 1.0
let inputKeys = currentFilter.inputKeys
if inputKeys.contains(kCIInputIntensityKey) {
currentFilter.setValue(amount, forKey: kCIInputIntensityKey)
}
if inputKeys.contains(kCIInputRadiusKey) {
currentFilter.setValue(amount * 200, forKey: kCIInputRadiusKey)
}
if inputKeys.contains(kCIInputScaleKey) {
currentFilter.setValue(amount * 10, forKey: kCIInputScaleKey)
}
guard let outputImage = currentFilter.outputImage else { return }
if let cgimg = context.createCGImage(outputImage, from: outputImage.extent) {
let uiImage = UIImage(cgImage: cgimg)
image = Image(uiImage: uiImage)
}
}
}