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

用意したフィルターは以下の通り。
1 2 3 4 5 6 7 8 9 |
let filterArray = ["CIPhotoEffectMono", "CIPhotoEffectChrome", "CIPhotoEffectFade", "CIPhotoEffectInstant", "CIPhotoEffectNoir", "CIPhotoEffectProcess", "CIPhotoEffectTonal", "CIPhotoEffectTransfer", "CISepiaTone"] |
ボタンが押されると以下の処理を行う。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 |
@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へ戻している。