Swiftで画像を処理するときにはCoreImageを使う。
ボタンを押すとフィルターが切り替わるアプリを作ってみた。
(と言っても参考書の通りだけど。)

用意したフィルターは以下の通り。
let filterArray = ["CIPhotoEffectMono", "CIPhotoEffectChrome", "CIPhotoEffectFade", "CIPhotoEffectInstant", "CIPhotoEffectNoir", "CIPhotoEffectProcess", "CIPhotoEffectTonal", "CIPhotoEffectTransfer", "CISepiaTone"]
ボタンが押されると以下の処理を行う。
@IBAction func effectButtonAction(_ sender: Any) { if let image = originalImage{ //UIImageの角度を記録 let rotate = image.imageOrientation // 入力画像をUIImageからCIImage型にする。角度情報は失われることに注意。 let inputImage = CIImage(image: image) //フィルターを選択 let filterName = filterArray[filterNumber] filterNumber += 1 if filterNumber == filterArray.count{ filterNumber = 0 } guard let effectFilter = CIFilter(name: filterName) else { return } effectFilter.setDefaults() //入力画像をセット effectFilter.setValue(inputImage, forKey: kCIInputImageKey) // 出力画像をセット guard let outputImage = effectFilter.outputImage else { return } //画像処理をするためのコンテキスト let ciContext = CIContext(options: nil) // 画像処理された画像が生成される。 guard let cgImage = ciContext.createCGImage(outputImage, from: outputImage.extent) else { return } // CIImageからUIImageへ変換する。角度やスケールは元のままにする。 effectImage.image = UIImage(cgImage: cgImage, scale: 1.0, orientation: rotate) } }
ポイントはUIImageからCIImageへ変換してから画像処理を行うこと。
変換が終わったらまたUIImageへ戻している。