[swift] [iOS] 実は簡単な画像フィルター


画像加工で周りを暗くして真ん中だけ元の色を残すやり方が以外に簡単だったので

まずは元の画像はこんな感じ

結果

ここからがコード

記載するコードはこれだけ
※コメントのほうに@loveeさんから指摘して頂いたコードが
あるので下記のコードと照らしあわせてみてください。

override func viewDidLoad() {
    super.viewDidLoad()

    viewImage.image = UIImage(named: "IMG_3368")

    let filteredImage = CIImage(image: self.viewImage.image!)
    let filter = CIFilter(name: "CIVignette")

    filter!.setValue(filteredImage, forKey: "inputImage")
    filter!.setValue(NSNumber(float: 9.0), forKey: "inputIntensity")


    let ciContext = CIContext(options: nil)
    let imageRef = ciContext.createCGImage((filter?.outputImage)!, fromRect: (filter?.outputImage!.extent)!)
    let outputImage = UIImage(CGImage: imageRef)
    self.viewImage.image = outputImage

}

とりあえず適当な画像をいれる

code
viewImage.image = UIImage(named: "任意の画像")

UIImageをCIImageにキャスト

code
let filteredImage = CIImage(image: self.viewImage.image!)

フィルターを選ぶ

code
let filter = CIFilter(name: "CIVignette")
※フィルターは色々あるのでこちらを参考に色々ためしてみてくださいー
Core Image Filter Reference by Apple

フィルターに値を入れていく

code
イメージをセット
filter!.setValue(filteredImage, forKey: "inputImage")

周りの色の濃さを変更
filter!.setValue(NSNumber(float: 9.0), forKey: "inputIntensity")
※NSNumber(float: 9.0)ここの数値を変更すると色の濃さが変わる

コンテキストをつくってフィルターを適応

※このCIContextがいまいち意味がわからん
let ciContext = CIContext(options: nil)
let imageRef = ciContext.createCGImage((filter?.outputImage)!, fromRect: filter?.outputImage!.extent)!)

フィルターを通した画像を変数に入れる

code
let outputImage = UIImage(CGImage: imageRef)

フィルタ加工した画像を代入してやる

self.viewImage.image = outputImage

とまぁこんな感じで簡単だった。
処理が結構重いのか表示に少し時間がかかるので、そのへんの細かいところは
UXでカバーしてみる。。。

間違っているところなどあれば、優しくつっこんでください!