LoginSignup
25
25

More than 5 years have passed since last update.

OSX、Swiftで写真加工 (CIFilter)

Posted at

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

入力画像
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
}

出力画像
out-02.jpg

まとめ

CIFIlterはかなり充実していていろいろできます。iOSとOSXで微妙に違う部分もありますが、わりと同じように使えて便利でした。

以下がCIFilterのリファレンスです。

iOS
https://developer.apple.com/library/ios/documentation/GraphicsImaging/Reference/CoreImageFilterReference/index.html

Mac
https://developer.apple.com/library/mac/documentation/GraphicsImaging/Reference/CoreImageFilterReference/index.html

おまけ

実際にCIFilterを使ってつくったiOSカメラアプリです
http://swdyh.tumblr.com/post/136317130125/buttonlesscam-長押しで撮影するiosのカメラアプリをつくった

25
25
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
25
25