Core Image の CIFilter でいろいろなフィルタ処理(画像処理/画像加工)ができるのはみなさまよくご存知かと思いますが、iOS 8 では CIKernel というクラスが追加され、そのフィルタ(CIFilter)を自作できるようになりました。
本記事は、その作成手順について、6/20日に開催された WWDC 2014 振り返り勉強会で発表したものです。もともとアップしないつもりで Markdown でスライドをつくった のをそのまま貼り付けてるので、少々読みづらい部分があるかもしれません。
同勉強会では、この CIKernel の内容がちょっとしかなかったので、同じく iOS 8 の新機能である HealthKit、HomeKit を対応デバイスなしですぐに試す方法 についても話しました。
また(ちょっと古いですが、)Core Image、画像処理関連の記事は他にもいろいろと書いているので、よろしければご参照ください。
- Core Image の遷移エフェクトを使う - Over&Out その後
- たったの6ステップ!『漫画カメラ』風に写真を加工するiPhoneアプリの作り方 - Over&Out その後
- 『第3回 iphone_dev_jp 東京iPhone/Mac勉強会』で vImage について発表してきました - Over&Out その後
- iOS - 「顔以外」のものを画像認識する - Qiita
CIKernel とは
- フィルタを自作できる
- OS X では以前からあった
CIKernelのつくりかた
カーネルはOpenGLのシェーディング言語で書く
kernel vec4 swapRedAndGreenAmount ( __sample s, float amount ) { return mix(s.rgba, s.grba, amount); }
→ 文字列として CIKernel の初期化メソッドに渡す
CIKernel *kernel = [CIKernel kernelWithString:kernelStr];
CIKernel を適用する
こんな感じ
- (CIImage *)outputImage { return [[self myKernel] applyWithExtent:self.inputImage.extent arguments:@[self.inputImage, self.inputAmount]]; }
CIFilter サブクラスをつくる
自作 CIKernel をつかって、CIFilter サブクラスをつくる。
@interface MyFilter : CIFilter @property (nonatomic, strong) CIImage *inputImage; @property (nonatomic, copy) NSNumber *inputAmount; @end
(実装は省略。WWDCスライドにあります)
フィルタとしての使い方は普通の CIFilter と同じ
NSDictionary *params = @{kCIInputImageKey: ciImage, @"inputAmount": @(1.0), }; CIFilter *filter = [CIFilter filterWithName:@"MyFilter" withInputParameters:params];
デモ
(自分で実装したやつがあるのですがスクショは微妙なところなのでWWDCセッションスライドのを貼っておきます。)
参考資料
動画
- Developing Core Image Filter for iOS (515)
Dev Center
- CIKernel Class Reference (現状 OS X 版のみ)