Core Image の CIFilter でいろいろなフィルタ処理(画像処理/画像加工)ができるのはみなさまよくご存知かと思いますが、iOS 8 では CIKernel というクラスが追加され、そのフィルタ(CIFilter)を自作できるようになりました。
本記事は、その作成手順について、6/20日に開催された WWDC 2014 振り返り勉強会で発表したものです。もともとアップしないつもりで Markdown でスライドをつくった のをそのまま貼り付けてるので、少々読みづらい部分があるかもしれません。
同勉強会では、この CIKernel の内容がちょっとしかなかったので、同じく iOS 8 の新機能である HealthKit、HomeKit を対応デバイスなしですぐに試す方法 についても話しました。
また(ちょっと古いですが、)Core Image、画像処理関連の記事は他にもいろいろと書いているので、よろしければご参照ください。
- http://d.hatena.ne.jp/shu223/20130311/1362962817
- http://d.hatena.ne.jp/shu223/20121129/1354145960
- http://d.hatena.ne.jp/shu223/20120721/1342858736
- 「顔以外」のものを画像認識する on 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];
参考資料
動画
- Developing Core Image Filter for iOS (515)
Dev Center
- CIKernel Class Reference (現状 OS X 版のみ)