【Swift】CoreImageを使って画像にエフェクトをかけてみた

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へ戻している。

たった2日でマスターできるiPhoneアプリ開発集中講座 Xcode 11 Swift 5対応 Kindle版

ABOUTこの記事をかいた人

個人アプリ開発者。Python、Swift、Unityのことを発信します。月間2.5万PVブログ運営。 Twitter:@yamagablog