前回に続いて、CoreImageのCICategoryColorAdjustmentフィルターを試してみました。
CoreImageのフィルターを試してみる(CICategoryBlur) - しめ鯖日記
今回も画像はぱくたそ様のものを使わせて頂きました。
画像表示処理は下の通りです。
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)
}
逆に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)
}
他にも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)
}
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にすると下のように少し暗くなります。
inputBrightnessを0.5にすると、明るさが増します。
inputContrastを0.5にすると少しぼやけたような画像になります。
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)
}
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)
}