下記事の続きです。
今回もフィルターを使った画像加工を試してみました。
今回はCICategoryColorAdjustmentのCILinearToSRGBToneCurve以降を見ていきます。
実装内容は前回同様、以下のようになります。
import UIKit class ViewController: UIViewController { override func viewDidLoad() { let imageView = UIImageView(image: #imageLiteral(resourceName: "image")) 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) } } }
CILinearToSRGBToneCurve
ドキュメントによると下のようなフィルターのようです。
Maps color intensity from a linear gamma curve to the sRGB color space.
let filter = CIFilter(name: "CILinearToSRGBToneCurve") let ciImage = CIImage(image: #imageLiteral(resourceName: "image")) filter?.setValue(ciImage, forKey: kCIInputImageKey) if let filteredImage = filter?.outputImage { imageView.image = UIImage(ciImage: filteredImage) }
実際に動かしたところ、元画像より少し薄くなりました。
CISRGBToneCurveToLinear
こちらはCILinearToSRGBToneCurveと反対で、SRGBToneCurveをLinearに直すものです。
先程と反対に、色が濃くなりました。
CITemperatureAndTint
色温度と色合いを変更できるフィルターです。
inputNeutralのxの値を少なくすると青っぽく、yの値を大きくすると赤っぽくなりました。
inputTargetNeutralについては効果がわかりませんでした。
let filter = CIFilter(name: "CITemperatureAndTint") let ciImage = CIImage(image: #imageLiteral(resourceName: "image")) filter?.setValue(ciImage, forKey: kCIInputImageKey) filter?.setValue(CIVector(x: 6500, y: 0), forKey: "inputNeutral") filter?.setValue(CIVector(x: 6500, y: 0), forKey: "inputTargetNeutral") if let filteredImage = filter?.outputImage { imageView.image = UIImage(ciImage: filteredImage) }
CIToneCurve
トーンカーブを変更できるフィルターです。
let filter = CIFilter(name: "CIToneCurve") let ciImage = CIImage(image: #imageLiteral(resourceName: "image")) filter?.setValue(ciImage, forKey: kCIInputImageKey) filter?.setValue(CIVector(x: 0.00, y: 0.00), forKey: "inputPoint0") filter?.setValue(CIVector(x: 0.25, y: 0.25), forKey: "inputPoint1") filter?.setValue(CIVector(x: 0.50, y: 0.50), forKey: "inputPoint2") filter?.setValue(CIVector(x: 0.75, y: 0.75), forKey: "inputPoint3") filter?.setValue(CIVector(x: 1.00, y: 1.00), forKey: "inputPoint4") if let filteredImage = filter?.outputImage { imageView.image = UIImage(ciImage: filteredImage) }
下のようにx=0.5以降のyを1.0にすることで、白に近い色だけを更に白っぽくしたりできます。
filter?.setValue(CIVector(x: 0.00, y: 0.00), forKey: "inputPoint0") filter?.setValue(CIVector(x: 0.25, y: 0.25), forKey: "inputPoint1") filter?.setValue(CIVector(x: 0.50, y: 1.00), forKey: "inputPoint2") filter?.setValue(CIVector(x: 0.75, y: 1.00), forKey: "inputPoint3") filter?.setValue(CIVector(x: 1.00, y: 1.00), forKey: "inputPoint4")
CIVibrance
肌の色を保ちつつ、彩度を調整してくれるようです。
let filter = CIFilter(name: "CIVibrance") let ciImage = CIImage(image: #imageLiteral(resourceName: "image")) filter?.setValue(ciImage, forKey: kCIInputImageKey) filter?.setValue(1000, forKey: "inputAmount") if let filteredImage = filter?.outputImage { imageView.image = UIImage(ciImage: filteredImage) }
CIWhitePointAdjust
Adjusts the reference white point for an image and maps all colors in the source using the new reference.
リファレンスによると上のようなフィルターでした。
青色を入れたら濃い目の青に、黄色を入れたらほぼそのままでした。
おそらく画像の基準の色(この写真だと黄色)とinputColorとの差分を元に何かしているのだと思います。
let filter = CIFilter(name: "CIWhitePointAdjust") let ciImage = CIImage(image: #imageLiteral(resourceName: "image")) filter?.setValue(ciImage, forKey: kCIInputImageKey) filter?.setValue(CIColor.blue(), forKey: "inputColor") if let filteredImage = filter?.outputImage { imageView.image = UIImage(ciImage: filteredImage) }