iOSのアプリをつくっていたときに、CIFilterのパラメータを変えたりしてはビルドして実機やシミュレータで確認するののがあまりに面倒だったので、ふとOSX側でやってみたら意外とさくさくできたので、その方法です。
iOSで写真をフィルタ実装するときのプロトタイプにも使えるし、OSXで複数の写真にフィルターをかけるとかにも使えると思います。
クロームのフィルターを掛けてみる
import Cocoa
func myFilter(img: CIImage) -> CIImage? {
guard let filter = CIFilter(name: "CIPhotoEffectChrome") else {
return nil
}
filter.setValue(img, forKey: "inputImage")
return filter.outputImage
}
func main() {
if Process.arguments.count < 3 {
print("err: args input_image_path output_image_path")
exit(1)
}
let inputURL = NSURL(fileURLWithPath: Process.arguments[1])
let outputURL = NSURL(fileURLWithPath: Process.arguments[2])
guard let img = CIImage(contentsOfURL: inputURL) else {
print("err: input img error")
exit(1)
}
guard let outImg = myFilter(img) else {
print("err: filter error")
exit(1)
}
let cg = CIContext().createCGImage(outImg, fromRect: outImg.extent)
if let dest = CGImageDestinationCreateWithURL(outputURL, kUTTypeJPEG, 1, nil) {
CGImageDestinationAddImage(dest, cg, nil)
CGImageDestinationFinalize(dest)
}
}
main()
xcrunを使って実行してみます
xcrun swift filter.swift input.jpg out.jpg
もうちょっといろいろ調整してみる
func myFilter(img: CIImage) -> CIImage? {
guard let vfilter = CIFilter(name: "CIVignette") else {
return nil
}
vfilter.setValue(1.2, forKey: "inputRadius")
vfilter.setValue(1.5, forKey: "inputIntensity")
vfilter.setValue(img, forKey: "inputImage")
guard let cfilter = CIFilter(name: "CIColorControls") else {
return nil
}
cfilter.setDefaults()
cfilter.setValue(0.95, forKey: "inputSaturation")
cfilter.setValue(1.05, forKey: "inputContrast")
cfilter.setValue(vfilter.outputImage, forKey: "inputImage")
guard let efilter = CIFilter(name: "CIExposureAdjust") else {
return nil
}
efilter.setValue(0.45, forKey: "inputEV")
efilter.setValue(cfilter.outputImage, forKey: "inputImage")
return efilter.outputImage
}
まとめ
CIFIlterはかなり充実していていろいろできます。iOSとOSXで微妙に違う部分もありますが、わりと同じように使えて便利でした。
以下がCIFilterのリファレンスです。
おまけ
実際にCIFilterを使ってつくったiOSカメラアプリです
http://swdyh.tumblr.com/post/136317130125/buttonlesscam-長押しで撮影するiosのカメラアプリをつくった