1

私は画像フィルターアプリに取り組んでいます。以下のコードを使用してフィルターを作成しました。

context = [CIContext contextWithOptions:nil];



    beginImage = [[CIImage alloc] initWithImage:[UIImage imageNamed:@"biscus_small.png"]];


    filter = [CIFilter filterWithName:@"CISepiaTone" 
                                  keysAndValues: kCIInputImageKey, beginImage, 
                        @"inputIntensity", [NSNumber numberWithFloat:0.8], nil];

次に、ユーザーがフィルターを選択すると、フィルターが適用された後に CIImage を取得し、UIImageView に割り当てます。何らかの理由で、setImage の後の UIImageView に白 (何も表示されない) が表示されます。

CIImage *outputImage = [filter outputImage];

   // CGImageRef cgimg = 
   // [context createCGImage:outputImage fromRect:[outputImage extent]];

    UIImage *finalImage = [UIImage imageWithCIImage:outputImage];

    [self.imageView setImage:finalImage];

CIContext の createCGImage メソッドを使用すると、正常に動作し、フィルタを使用して画像が表示されますが、createCGImage を使用すると非常に遅くなります。

4

1 に答える 1

6

CIImage が非常に遅い理由-createCGImage:fromRect:は、これがラスター ビットマップの処理と出力を実際にトリガーするためです。出力 CIImage を UIImage に割り当てても、画像が処理されて出力レンダリングされることはありません。Core Image を介して画像をフィルタリングする場合、この手順を回避することはできません。

この回答で述べたように、iOS での Core Image のパフォーマンスは、iOS 5.1 の時点で少し残念です。私が提案することがあるとすれば、GPU で高速化された画像処理を行い、テストしたほぼすべての状況で Core Image のパフォーマンスを上回るオープン ソース フレームワークを構築しました。画像フィルタリングについては、iPhone 4 の Core Image よりも約 4 倍高速です。

ただし、フィルタリングの際に UIImage との間でやり取りを行うにはまだいくらかのオーバーヘッドがあるため、未加工の画像バイトを処理する能力があれば、未加工データの入出力は UIImage を処理するよりもはるかに高速です。このフレームワークに直接 JPEG と PNG の入力と出力を追加して、UIImage を経由するよりも高速なパスを提供します。

于 2012-05-31T19:33:13.743 に答える