下の続きになります。
今回もCoreImageのフィルターを使って画像加工を実装していきます。
フィルターはCICategoryColorAdjustmentのCIColorPolynomial以降を見ていきます。
実装は下の通りです。
画像は今回もぱくたそ様のものを利用させて頂きました。
import UIKit import CoreImage class ViewController: UIViewController { let imageView = UIImageView(image: #imageLiteral(resourceName: "image")) override func viewDidLoad() { super.viewDidLoad() imageView.frame = CGRect( x: (view.frame.width - #imageLiteral(resourceName: "image").size.width) / 2, y: 20, width: #imageLiteral(resourceName: "image").size.width, height: #imageLiteral(resourceName: "image").size.height) view.addSubview(imageView) // フィルターをかける // let filter = CIFilter(name: "CIBoxBlur") // let ciImage = CIImage(image: #imageLiteral(resourceName: "image")) // filter?.setValue(ciImage, forKey: kCIInputImageKey) // if let filteredImage = filter?.outputImage { // imageView.image = UIImage(ciImage: filteredImage) // } } }
CIColorPolynomial
CIColorPolynomial
は3次多項式を追加する事で色の変更を行うようです。
説明だけでは分からなかったので実際に試してみたいと思います。
フィルターは、下のような値をセットする事ができます。
各色のデフォルト値はCIVector(x: 0, y: 1, z: 0, w: 0)です。
let filter = CIFilter(name: "CIColorPolynomial") let ciImage = CIImage(image: #imageLiteral(resourceName: "image")) filter?.setValue(ciImage, forKey: kCIInputImageKey) filter?.setValue(CIVector(x: 0, y: 1, z: 0, w: 0), forKey: "inputRedCoefficients") filter?.setValue(CIVector(x: 0, y: 1, z: 0, w: 0), forKey: "inputGreenCoefficients") filter?.setValue(CIVector(x: 0, y: 1, z: 0, w: 0), forKey: "inputBlueCoefficients") filter?.setValue(CIVector(x: 0, y: 1, z: 0, w: 0), forKey: "inputAlphaCoefficients") if let filteredImage = filter?.outputImage { imageView.image = UIImage(ciImage: filteredImage) }
inputRedCoefficientsの値を色々変更してみました。
まずはxを0から1に変更しました。
filter?.setValue(CIVector(x: 1, y: 1, z: 0, w: 0), forKey: "inputRedCoefficients")
かなり強い赤になりました。
続けてzを1にします。
filter?.setValue(CIVector(x: 0, y: 1, z: 1, w: 0), forKey: "inputRedCoefficients")
先程よりは弱めの赤になりました。
wを1にした場合も弱めの赤になりました。
逆にyを0にすると、赤が消えて青っぽい画像になりました。
filter?.setValue(CIVector(x: 0, y: 0, z: 0, w: 0), forKey: "inputRedCoefficients")
CIExposureAdjust
こちらは露光の調整をしてくれるフィルターです。
inputEVの値を1にする事で、明るい写真になります。
let filter = CIFilter(name: "CIExposureAdjust") let ciImage = CIImage(image: #imageLiteral(resourceName: "image")) filter?.setValue(ciImage, forKey: kCIInputImageKey) filter?.setValue(1.0, forKey: "inputEV") if let filteredImage = filter?.outputImage { imageView.image = UIImage(ciImage: filteredImage) }
CIGammaAdjust
画像のガンマ値を調整する機能です。
inputPowerという値をセットして色を調整します。
ドキュメントによると、inputPowerはpow(s.rgb, vec3(power))
という式で適用されます。
つまり下のように1より大きい値を入れると色がかなり暗くなります。
let filter = CIFilter(name: "CIGammaAdjust") let ciImage = CIImage(image: #imageLiteral(resourceName: "image")) filter?.setValue(ciImage, forKey: kCIInputImageKey) filter?.setValue(5, forKey: "inputPower") if let filteredImage = filter?.outputImage { imageView.image = UIImage(ciImage: filteredImage) }
CIHueAdjust
色相を調整するフィルターです。
inputAngleに角度を入れる事で調整できます。
inputAngleの単位はラジアンで、下の場合は真逆の色相に変換しています。
let filter = CIFilter(name: "CIHueAdjust") let ciImage = CIImage(image: #imageLiteral(resourceName: "image")) filter?.setValue(ciImage, forKey: kCIInputImageKey) filter?.setValue(3.14, forKey: "inputAngle") if let filteredImage = filter?.outputImage { imageView.image = UIImage(ciImage: filteredImage) }