Created
February 20, 2019 06:27
-
-
Save yoheiMune/3bcbb6f6aafb0624ac9183ff8a4ae474 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// | |
// FilterViewController.swift | |
// CameraFilter | |
// | |
// Created by Munesada Yohei on 2019/02/19. | |
// Copyright © 2019 Munesada Yohei. All rights reserved. | |
// | |
import UIKit | |
class FilterViewController : UIViewController { | |
// ユーザーが選択した画像. | |
var image: UIImage! | |
// 温かみフィルターを使うか | |
var warmFilterEnabled = false | |
// 彩度(画像の鮮やかさ)フィルターに利用する値. | |
// -1 〜 1 までを画像のスライダーで指定できるようにします. | |
var saturationFilterValue: Float = 0 | |
// オリジナル画像View. | |
@IBOutlet weak var originalImageView: UIImageView! | |
// フィルターをかけた画像View. | |
@IBOutlet weak var filteredImageView: UIImageView! | |
override func viewDidLoad() { | |
self.title = "フィルター加工しよう!" | |
// 最初は、どちらのImageViewにも、ユーザーの選択した画像を表示する. | |
self.originalImageView.image = image | |
self.filteredImageView.image = image | |
} | |
// 温かみを追加ボタンがタップされた. | |
@IBAction func onTapWarm(_ sender: Any) { | |
// 温かみフィルターを利用するかを、トグルする. | |
self.warmFilterEnabled = !self.warmFilterEnabled | |
// フィルターを適用する. | |
self.adaptFilter() | |
} | |
// スライダーで値が変わった. | |
@IBAction func onChangeSlider(_ sender: UISlider) { | |
// スライダーの値を取得. | |
self.saturationFilterValue = sender.value | |
// フィルターを適用する. | |
self.adaptFilter() | |
} | |
// 画像にフィルターをかけます. | |
private func adaptFilter() { | |
// 加工対象の画像を用意します. | |
guard var image = self.image else { | |
return | |
} | |
// 温かみフィルターがONの場合は、適用します. | |
if self.warmFilterEnabled { | |
// CIImageに変換します. | |
guard let ciImage = CIImage(image: image) else { | |
return | |
} | |
// 温かみフィルターを作成します. | |
guard let filter = CIFilter(name: "CIPhotoEffectTransfer") else { | |
return | |
} | |
// 温かみフィルターを適用します. | |
filter.setDefaults() | |
filter.setValue(ciImage, forKey: kCIInputImageKey) | |
// CIImage から CGImage に変換します. | |
guard | |
let outputCIImage = filter.outputImage, | |
let cgImage = CIContext(options: nil).createCGImage(outputCIImage, from: outputCIImage.extent) else { | |
return | |
} | |
// CGImage から UIImage に変換します. | |
let filteredImage = UIImage(cgImage: cgImage, scale: 1, orientation: image.imageOrientation) | |
// 加工対象の画像の変数に代入します. | |
image = filteredImage | |
} | |
// 彩度フィルターを適用する. | |
if self.saturationFilterValue != 0 { | |
// CIImageの作成する. | |
guard let ciImage = CIImage(image: image) else { | |
return | |
} | |
// 彩度フィルターを作成する. | |
guard let filter = CIFilter(name: "CIVibrance") else { | |
return | |
} | |
// フィルターに彩度を指定する. | |
filter.setValue(self.saturationFilterValue, forKey: "inputAmount") | |
// フィルターを適用する. | |
filter.setValue(ciImage, forKey: kCIInputImageKey) | |
// CGImageを作成する. | |
guard | |
let outputCIImage = filter.outputImage, | |
let cgImage = CIContext(options: nil).createCGImage(outputCIImage, from: outputCIImage.extent) else { | |
return | |
} | |
// CGImage から UIImage を作成する. | |
let filteredImage = UIImage(cgImage: cgImage, scale: 1, orientation: image.imageOrientation) | |
// 加工対象の画像の変数に代入します. | |
image = filteredImage | |
} | |
// フィルター画像Viewに反映します. | |
self.filteredImageView.image = image | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment