CIImageのドキュメントから:
CIImage オブジェクトには画像データが関連付けられていますが、画像ではありません。CIImage オブジェクトは、イメージの「レシピ」と考えることができます。CIImage オブジェクトには、画像を生成するために必要なすべての情報が含まれていますが、Core Image は、そうするように指示されるまで、実際には画像をレンダリングしません。この「遅延評価」方式により、Core Image は可能な限り効率的に動作することができます。
これは、適用した (またはより適切に適用するように要求された)フィルタリングCIImage
は、画像をレンダリングするまで実際には発生しないことを意味しますCGImageRef
。それがおそらく、速度低下を経験している理由です。
とはいえ、フィルタリングCIImage
は一般的に非常に高速なプロセスであるため、画像サイズに基づいて低速の定義を提供する必要があります.
最後に、ボトルネックが実際にあると思われる場所にあることを確認するには、Instruments を使用してアプリケーションをプロファイリングする必要があります。
編集
カラー フィルターを適用して、iPad3 のデバイス カメラ (960x540) からの画像ストリームをフィルター処理するサンプル プロジェクトを作成しようとしましたが、CIColorMap
60fps (~16ms) を超えています。
CIContext
アプリケーションによっては、ColorMapFilter
、 、inputGradientImage
(時間の経過とともに変化しない場合)を再利用し、inputImage
反復ごとにのみを更新することで、パフォーマンスを向上させることができます。
たとえば、一度呼び出してから、処理するすべてのフレームをprepareFrameFiltering
繰り返し呼び出します。applyFilterToFrame:
@property (nonatomic, strong) CIContext *context;
@property (nonatomic, strong) CIFilter *colorMapFilter;
- (void)prepareFrameFiltering {
self.context = [CIContext contextWithOptions:nil];
CIImage *colorMap = [CIImage imageWithCGImage:[UIImage imageNamed:@"gradient.jpg"].CGImage];
self.colorMapFilter = [CIFilter filterWithName:@"CIColorMap"];
[self.colorMapFilter setValue:colorMap forKey:@"inputGradientImage"];
}
- (void)applyFilterToFrame:(CIImage *)ciFrame {
// filter
[self.colorMapFilter setValue:ciFrame forKey:@"inputImage"];
CIImage *ciImageResult = [self.colorMapFilter valueForKey: @"outputImage"];
CGImageRef ref = [self.context createCGImage:ciImageResult fromRect:ciFrame.extent];
// do whatever you need
CGImageRelease(ref);
}