前回に続いて、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) }