しめ鯖日記

swift, iPhoneアプリ開発, ruby on rails等のTipsや入門記事書いてます

CoreImageのフィルターを試してみる(CICategoryColorAdjustment、その1)

前回に続いて、CoreImageのCICategoryColorAdjustmentフィルターを試してみました。

CoreImageのフィルターを試してみる(CICategoryBlur) - しめ鯖日記

今回も画像はぱくたそ様のものを使わせて頂きました。

f:id:llcc:20170910143041p:plain

画像表示処理は下の通りです。

import UIKit

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)
}

CIColorClamp

CIColorClampは画像のRGBAの値を調整できるフィルターです。
inputMaxComponentsとinputMinComponentsを使って調整します。

次のようにinputMinComponentsの赤部分を1にすると、画像が赤くなります。

let filter = CIFilter(name: "CIColorClamp")
let ciImage = CIImage(image: #imageLiteral(resourceName: "image"))
filter?.setValue(ciImage, forKey: kCIInputImageKey)
filter?.setValue(CIVector(x: 1, y: 1, z: 1, w: 1), forKey: "inputMaxComponents")
filter?.setValue(CIVector(x: 1, y: 0, z: 0, w: 0), forKey: "inputMinComponents")
if let filteredImage = filter?.outputImage {
    imageView.image = UIImage(ciImage: filteredImage)
}

f:id:llcc:20170910150844p:plain

逆にinputMaxComponentsの赤部分を0にすることで、赤味をなくす事もできます。

let filter = CIFilter(name: "CIColorClamp")
let ciImage = CIImage(image: #imageLiteral(resourceName: "image"))
filter?.setValue(ciImage, forKey: kCIInputImageKey)
filter?.setValue(CIVector(x: 0, y: 1, z: 1, w: 1), forKey: "inputMaxComponents")
filter?.setValue(CIVector(x: 0, y: 0, z: 0, w: 0), forKey: "inputMinComponents")
if let filteredImage = filter?.outputImage {
    imageView.image = UIImage(ciImage: filteredImage)
}

f:id:llcc:20170910151045p:plain

他にもAlpha値を調整して、画像を半透明にすることもできます。

let filter = CIFilter(name: "CIColorClamp")
let ciImage = CIImage(image: #imageLiteral(resourceName: "image"))
filter?.setValue(ciImage, forKey: kCIInputImageKey)
filter?.setValue(CIVector(x: 1, y: 1, z: 1, w: 0.5), forKey: "inputMaxComponents")
filter?.setValue(CIVector(x: 0, y: 0, z: 0, w: 0), forKey: "inputMinComponents")
if let filteredImage = filter?.outputImage {
    imageView.image = UIImage(ciImage: filteredImage)
}

f:id:llcc:20170910151152p:plain

CIColorControls

CIColorControlsは彩度、明るさ、コントラストを調整します。
セットする値は、下のinputSaturationとinputBrightnessとinputContrastの3つです。

let filter = CIFilter(name: "CIColorControls")
let ciImage = CIImage(image: #imageLiteral(resourceName: "image"))
filter?.setValue(ciImage, forKey: kCIInputImageKey)
filter?.setValue(1, forKey: "inputSaturation")
filter?.setValue(0, forKey: "inputBrightness")
filter?.setValue(1, forKey: "inputContrast")
if let filteredImage = filter?.outputImage {
    imageView.image = UIImage(ciImage: filteredImage)
}

inputSaturationを0.5にすると下のように少し暗くなります。

f:id:llcc:20170910152012p:plain

inputBrightnessを0.5にすると、明るさが増します。

f:id:llcc:20170910152101p:plain

inputContrastを0.5にすると少しぼやけたような画像になります。

f:id:llcc:20170910152131p:plain

CIColorMatrix

CIColorMatrixはCIColorClampと同様にRGBAを調整するフィルターです。
下のように各色のベクトルを調整することで画像を調整します。

let filter = CIFilter(name: "CIColorMatrix")
let ciImage = CIImage(image: #imageLiteral(resourceName: "image"))
filter?.setValue(ciImage, forKey: kCIInputImageKey)
filter?.setValue(CIVector(x: 1, y: 0, z: 0, w: 0), forKey: "inputRVector")
filter?.setValue(CIVector(x: 0, y: 1, z: 0, w: 0), forKey: "inputGVector")
filter?.setValue(CIVector(x: 0, y: 0, z: 1, w: 0), forKey: "inputBVector")
filter?.setValue(CIVector(x: 0, y: 0, z: 0, w: 1), forKey: "inputAVector")
filter?.setValue(CIVector(x: 0, y: 0, z: 0, w: 0), forKey: "inputBiasVector")
if let filteredImage = filter?.outputImage {
    imageView.image = UIImage(ciImage: filteredImage)
}

inputGVectorのyを0にすると、緑色のない画像になります。

let filter = CIFilter(name: "CIColorMatrix")
let ciImage = CIImage(image: #imageLiteral(resourceName: "image"))
filter?.setValue(ciImage, forKey: kCIInputImageKey)
filter?.setValue(CIVector(x: 1, y: 0, z: 0, w: 0), forKey: "inputRVector")
filter?.setValue(CIVector(x: 0, y: 0, z: 0, w: 0), forKey: "inputGVector")
filter?.setValue(CIVector(x: 0, y: 0, z: 1, w: 0), forKey: "inputBVector")
filter?.setValue(CIVector(x: 0, y: 0, z: 0, w: 1), forKey: "inputAVector")
filter?.setValue(CIVector(x: 0, y: 0, z: 0, w: 0), forKey: "inputBiasVector")
if let filteredImage = filter?.outputImage {
    imageView.image = UIImage(ciImage: filteredImage)
}

f:id:llcc:20170910152725p:plain

inputBiasVectorのyに1を入れると、緑色の画像になります。

let filter = CIFilter(name: "CIColorMatrix")
let ciImage = CIImage(image: #imageLiteral(resourceName: "image"))
filter?.setValue(ciImage, forKey: kCIInputImageKey)
filter?.setValue(CIVector(x: 1, y: 0, z: 0, w: 0), forKey: "inputRVector")
filter?.setValue(CIVector(x: 0, y: 0, z: 0, w: 0), forKey: "inputGVector")
filter?.setValue(CIVector(x: 0, y: 0, z: 1, w: 0), forKey: "inputBVector")
filter?.setValue(CIVector(x: 0, y: 0, z: 0, w: 1), forKey: "inputAVector")
filter?.setValue(CIVector(x: 0, y: 0, z: 0, w: 0), forKey: "inputBiasVector")
if let filteredImage = filter?.outputImage {
    imageView.image = UIImage(ciImage: filteredImage)
}

f:id:llcc:20170910152811p:plain