1

本当の違いは何ですか:

[GPUImageFilter imageFromCurrentlyProcessedOutputWithOrientation]

[GPUImageFilter imageByFilteringImage:]

... NSImage を必要とする imageByFilteringImage は別として *?

速度に違いはありますか?imageByFilterImage を使用すると、フィルターを再利用できる「パイプライン」などとして設定できますか? それとも、imageFromCurrentlyProcessedOutputWithOrientation を使用して BlendFilters (複数の画像入力を受け取る) を操作する必要がありますか?

私の理解では、imageFromCurrentlyProcessedOutputWithOrientation を使用する場合、新しい画像を処理するたびに新しいフィルターを作成する必要があります。これは正しいです?

4

1 に答える 1

4

オープン ソース ライブラリの優れた点の 1 つは、これらのメソッドの背後にあるコードを調べることができることです。CGImageRefs がベースとして使用される一般的なケースをカバーするように拡張されているため、以前よりも少し複雑ですが、ここでは-imageByFilteringImage:

GPUImagePicture *stillImageSource = [[GPUImagePicture alloc] initWithCGImage:imageToFilter];

[self prepareForImageCapture];

[stillImageSource addTarget:(id<GPUImageInput>)self];
[stillImageSource processImage];

CGImageRef processedImage = [self newCGImageFromCurrentlyProcessedOutputWithOrientation:orientation];

[stillImageSource removeTarget:(id<GPUImageInput>)self];
return processedImage;

-imageByFilteringImage:-imageFromCurrentlyProcessedOutputWithOrientation:その中で(実際にはその CGImage バリアントを)効果的に使用します。

UIImage または NSImage (iOS または Mac) を取り込み、そこから一時的な GPUImagePicture インスタンスを作成し、そこから現在のフィルターへのフィルター チェーンを構築し、 を使用して画像キャプチャを高速化するように設定し-prepareForImageCapture、画像を処理し、最後に 経由で結果を抽出し-newCGImageFromCurrentlyProcessedOutputWithOrientation:ます。

ご覧のとおり、これは便利なメソッドにすぎません。実際、新しい GPUImagePicture インスタンス (作成時に UIImage をテクスチャとしてアップロードする必要があります) を毎回作成するオーバーヘッドのために、繰り返し使用するとパフォーマンスに悪影響を与える可能性があります。

シンプルな1回限りの加工をご希望の場合-imageByFilteringImage:は大丈夫です。ただし、一般に、同じ画像を複数の方法で処理したい場合、または何らかの種類のブレンドやライブ プレビューを行いたい場合は、単一のフィルターよりも複雑なことを行うために独自のフィルター チェーンを作成する必要があります。効果。

-prepareForImageCaptureまた、いくつかの副作用があります。フィルタの出力テクスチャとローカル ピクセル バッファの間にメモリ マップを作成することで、メモリ使用量を大幅に削減し、画像抽出速度を向上させますが、そのマッピングは、抽出された UIImage が解放されるまで、フィルタをロックして他の処理を実行できなくなります。手動フィルター チェーンを作成する場合は、この呼び出しを使用しないことを決定できます。

于 2013-07-31T15:41:39.593 に答える