オープン ソース ライブラリの優れた点の 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 が解放されるまで、フィルタをロックして他の処理を実行できなくなります。手動フィルター チェーンを作成する場合は、この呼び出しを使用しないことを決定できます。