IOSアプリの画面の一部をぼかそうとすると問題が発生します。私がやろうとしていることについてのより良い考えについては、画像を参照してください。
「ぼかし」の内容だけをぼかす必要がありますが、残りははっきりさせることができます。したがって、テーブルビューを表示している場合は、(スクロールしても)BlurBoxの下のコンテンツのみがぼやけます。残りは明確に見えるでしょう。
私の最初のアプローチは、UIGraphicsGetImageFromCurrentImageContext()
を0.01秒ごとに呼び出して、BlurBoxの下のすべてのレイヤーを1つの画像にマッシュアップすることでした。次に、その画像をぼかし、すべての上に表示します。
私がぼかしのために試した方法は次のとおりです。
https://github.com/tomsoft1/StackBluriOS
https://github.com/coryleach/UIImageAdjust
https://github.com/esilverberg/ios-image-filters
https://github.com/cmkilger/CKImageAdditions
_[layer setRasterizationScale:0.25];
[layer setShouldRasterize:YES];
_
同様にいくつかのカスタムの試み。私はAppleの GLImageProcessing も調べましたが、ここでやろうとしていることには少しやり過ぎだと思います。
問題は、それらがすべてtoslowであることです。アプリはアプリストアに掲載されていないので、プライベート/ドキュメント化されていないフレームワークを使用できます。
私が持っていたある種のはるかに遠いアイデアは、私が使用するすべてのコンポーネント(UITableViewCells、UITableViewなど)のdrawRect
メソッドをオーバーライドし、その場でそれぞれを個別にぼかすことでした。しかし、これには少し時間がかかりますが、これは実行可能なオプションのように聞こえますか?
[〜#〜]更新[〜#〜]:
次のようにCIFilters
を使用しようとしました:
_CIImage *inputImage = [[CIImage alloc] initWithImage:[self screenshot]];
CIFilter *blurFilter = [CIFilter filterWithName:@"CIGaussianBlur"];
[blurFilter setDefaults];
[blurFilter setValue: inputImage forKey: @"inputImage"];
[blurFilter setValue: [NSNumber numberWithFloat:10.0f]
forKey:@"inputRadius"];
CIImage *outputImage = [blurFilter valueForKey: @"outputImage"];
CIContext *context = [CIContext contextWithOptions:nil];
self.bluredImageView.image = [UIImage imageWithCGImage:[context createCGImage:outputImage fromRect:outputImage.extent]];
_
これは機能しますが、非常に低速です。 :(
一部の実装では、ディスクからロードされたイメージを渡した場合にのみぼやけることがわかります。 UIGraphicsGetImageFromCurrentImageContext()
を使用して作成したUIImageを渡しても機能しません。これがなぜなのかについてのアイデアはありますか?
[〜#〜]更新[〜#〜]:
私はパテルの提案を次のように試みました:
_CALayer *backgroundLayer = [CALayer layer];
CIFilter *blurFilter = [CIFilter filterWithName:@"CIGaussianBlur"];
[blurFilter setDefaults];
backgroundLayer.backgroundFilters = [NSArray arrayWithObject:blurFilter];
[[self.view layer] addSublayer:backgroundLayer];
_
ただし、動作しません:(
バウンティが追加されたため、UPDATE:
私は TomSoft1のstackblur を使用してBlurBoxを正常に機能させることができました。彼はその場でRGBA形式(32ビット/ピクセル)に画像を正規化する機能を追加したからです。しかし、それはまだかなり遅いです。
私はタイマーを0.03秒ごとに更新を呼び出して、BlurBoxの下にあるものの画像を取得し、その画像をぼかし、画面に表示します。 BlurBoxの「fps」を上げるのに助けが必要です。
多種多様な画像処理効果のためにGPUで完全にサポートされている Brad Larson のGPUImageをお勧めします。それは非常に高速で、デモアプリでカメラからリアルタイムのビデオ処理を実行し、フレームレートが優れているほど高速です。
https://github.com/BradLarson/GPUImage
これは、画像の下部と上部の3分の3をぼかし、画像の中央をぼかさないままにする基本的なボックスぼかしを適用するために私が書いたコードスニペットです。彼のライブラリは非常に広範で、想像できるほとんどすべての種類の画像フィルター効果が含まれています。
GPUImagePicture *stillImageSource = [[GPUImagePicture alloc] initWithImage:[self screenshot]];
GPUImageTiltShiftFilter *boxBlur = [[GPUImageTiltShiftFilter alloc] init];
boxBlur.blurSize = 0.5;
[stillImageSource addTarget:boxBlur];
[stillImageSource processImage];
UIImage *processedImage = [stillImageSource imageFromCurrentlyProcessedOutput];
応答が少し遅いかもしれませんが、Core Imageフィルターを使用できます。それがとても遅い理由はこの線です。
CIContext *context = [CIContext contextWithOptions:nil];
Appleドキュメントでは、Core Imageで最高のパフォーマンスを得るために、最初に述べています
「レンダリングするたびにCIContext
オブジェクトを作成しないでください。コンテキストは多くの状態情報を保存します。それらを再利用する方が効率的です。」
これに対する私の個人的な解決策は、コアイメージコンテキストのシングルトンを作成することです。だから私は今まで一つだけ作成しました。
私のコードは、GitHubのこのデモプロジェクトにあります。
https://github.com/KyleLopez/DemoCoreImage
お気軽にご利用いただくか、別の解決策を見つけてください。 CoreImageで見つけた最も遅い部分はコンテキストです。その後の画像処理は本当に高速です。
私はこれをテストしていませんが、ボックスをぼかしたい場所にCALayer
を配置し、CIFilter
を設定して、CALayer's
backgroundFilters
。ちょっとした考え。
CALayer.backgroundFilters を参照してください
Apple Core Image Filter(CIFilter))ルーチンセットを試してみてください。iOS5が必要なため、使用できない場合があります。
あなたが試した方法よりも速いかどうかはわかりませんが、過去にプロジェクトで使用したことがあり、うまく機能しています。画面のぼかしたい部分をつかみ、それを画像に入れ、フィルターに通してから、画面の適切な場所に再表示すれば、動作するはずです。
フィルターを使用して画像の色をリアルタイムで変更しましたが、うまくいきました。
このライブラリを試しましたか:
https://github.com/gdawg/uiimage-dsp
それはvDSP/Accelerateフレームワークを使用し、使いやすいようです。
ところで:0.01秒は速すぎるようです。 0.03でも問題ありません。