【iOS】【swift】たった数行で画像のフィルタ/エフェクトが実現できる超便利フレームワークCoreImage


こちらのswift向けに書いてみました。(改めてタイトルを見るとアレですね。。

CoreImageを利用したフィルタをいくつかご紹介させていただきます。
iOSのバージョンが上がると、CoreImageの機能も拡張されたりするので
カメラアプリなど作る場合は多様する事もあるかもしれません。

今回紹介させていただく内容は、CIFilterを使い分ける事になります。

セピア【CISepiaTone】

以下コード


// image が 元画像のUIImage
let ciImage:CIImage = CIImage(image:image);
let ciFilter:CIFilter = CIFilter(name: "CISepiaTone")
ciFilter.setValue(ciImage, forKey: kCIInputImageKey)
ciFilter.setValue(0.8, forKey: "inputIntensity")
let ciContext:CIContext = CIContext(options: nil)
let cgimg:CGImageRef = ciContext.createCGImage(ciFilter.outputImage, fromRect:ciFilter.outputImage.extent())

//image2に加工後のUIImage
let image2:UIImage? = UIImage(CGImage: cgimg, scale: 1.0, orientation:UIImageOrientation.Up)


CIImageを生成し、それに対して、CIFilterを適用する形になっているかと思います。
基本的には他の加工も同様ですので、次以降はCIFilterのみ記載します。

グレースケール【CIColorMonochrome】


let ciFilter:CIFilter = CIFilter(name: "CIColorMonochrome")
ciFilter.setValue(ciImage, forKey: kCIInputImageKey)
ciFilter.setValue(CIColor(red: 0.75, green: 0.75, blue: 0.75), forKey: "inputColor")
ciFilter.setValue(1.0, forKey: "inputIntensity")

色の反転【CIColorInvert】


let ciFilter:CIFilter = CIFilter(name: "CIColorMonochrome")
ciFilter.setValue(ciImage, forKey: kCIInputImageKey)
ciFilter.setValue(CIColor(red: 0.75, green: 0.75, blue: 0.75), forKey: "inputColor")
ciFilter.setValue(1.0, forKey: "inputIntensity")

公式ドキュメントにもありますが、

CIColorInvert フィルタは画像の色を反転し、画像をネガフィルムのように見せますが、カラーネガフィルムのようなオレンジがかった色ではありません。色の反転フィルタは単にカラーを反転するだけなので、カラーネガフィルムを模倣するものではありません。

偽色【CIFalseColor】


let ciFilter:CIFilter = CIFilter(name: "CIFalseColor" )
ciFilter.setValue(ciImage, forKey: kCIInputImageKey)
ciFilter.setValue(CIColor(red: 0.44, green: 0.5, blue: 0.2), forKey: "inputColor0")
ciFilter.setValue(CIColor(red: 1, green: 0.92, blue: 0.50), forKey: "inputColor1")

色調節フィルタ(Color Adjustment Filters)


let ciFilter:CIFilter = CIFilter(name: "CIColorControls" )
ciFilter.setValue(ciImage, forKey: kCIInputImageKey)
ciFilter.setValue(1.0, forKey: "inputSaturation")
ciFilter.setValue(0.5, forKey: "inputBrightness")
ciFilter.setValue(3.0, forKey: "inputContrast")

トーンカーブ【CIToneCurve】


let ciFilter:CIFilter = CIFilter(name: "CIToneCurve" )
ciFilter.setValue(ciImage, forKey: kCIInputImageKey)
ciFilter.setValue(CIVector(x: 0.0, y: 0.0), forKey: "inputPoint0")
ciFilter.setValue(CIVector(x: 0.25, y: 0.1), forKey: "inputPoint1")
ciFilter.setValue(CIVector(x: 0.5, y: 0.5), forKey: "inputPoint2")
ciFilter.setValue(CIVector(x: 0.75, y: 0.9), forKey: "inputPoint3")
ciFilter.setValue(CIVector(x: 1.0, y: 1.0), forKey: "inputPoint4")

あくまで一例です。

”inputPoint0”〜”inputPoint4”までの(x、y)座標を設定します。
”inputPoint0” デフォルト値は”[0 0]”
”inputPoint1” デフォルト値は”[0.25 0.25]”
”inputPoint2” デフォルト値は”[0.5 0.5]”
”inputPoint3” デフォルト値は”[0.75 0.75]”
”inputPoint4” デフォルト値は”[1 1]”

色相調整【CIHueAdjust】


let ciFilter:CIFilter = CIFilter(name: "CIHueAdjust" )
ciFilter.setValue(ciImage, forKey: kCIInputImageKey)
ciFilter.setValue(3.14, forKey: "inputAngle")

”inputAngle” HSV色空間およびHLS色空間における色相の位置を指定する値(NSNumber)。これは 0.0 ~ 2 pi までの範囲の角度です。値 0 は赤色を示します。緑色は pi/3 ラジアンに相当し、青色は 2/3 pi ラジアンです。
デフォルト値は0 最大値3.14 最小値-3.14です。

以上です。面白そうなものがもしあったら追記するかもしれません。