その後のその後

iOSエンジニア 堤 修一のブログ github.com/shu223

CIKernelを使ったカスタムフィルタのつくりかた

Core Image の CIFilter でいろいろなフィルタ処理(画像処理/画像加工)ができるのはみなさまよくご存知かと思いますが、iOS 8 では CIKernel というクラスが追加され、そのフィルタ(CIFilter)を自作できるようになりました。


本記事は、その作成手順について、6/20日に開催された WWDC 2014 振り返り勉強会で発表したものです。もともとアップしないつもりで Markdown でスライドをつくった のをそのまま貼り付けてるので、少々読みづらい部分があるかもしれません。


同勉強会では、この CIKernel の内容がちょっとしかなかったので、同じく iOS 8 の新機能である HealthKit、HomeKit を対応デバイスなしですぐに試す方法 についても話しました。


また(ちょっと古いですが、)Core Image、画像処理関連の記事は他にもいろいろと書いているので、よろしければご参照ください。

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 版のみ