iOS アプリで画面の一部をぼかしようとすると問題が発生します。私がやろうとしていることのより良いアイデアについては、画像を参照してください。
「BlurBox」のコンテンツのみをぼかす必要があり、残りはクリアできます。そのため、テーブル ビューを見ている場合、BlurBox の下のコンテンツだけがぼやけます (スクロールしても)。残りは明確に見えます。
私の最初のアプローチは、すべての .01 を呼び出しUIGraphicsGetImageFromCurrentImageContext()
て、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も調べましたが、ここでやろうとしていることは少しやり過ぎだと思います。
問題は、それらがすべて遅いことです 。アプリはアプリ ストアに掲載されないため、非公開の/文書化されていないフレームワークを使用することにオープンです。
私が持っていた一種の遠いアイデアはdrawRect
、私が使用するすべてのコンポーネント (UITableViewCells、UITableView など) のメソッドをオーバーライドし、その場でそれぞれを個別にぼかすことでした。ただし、これには時間がかかりますが、これは実行可能なオプションのように思えますか?
更新:
私は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]];
これは機能しますが、信じられないほど遅いです。:(
ディスクからロードされたイメージを渡す場合にのみ、一部の実装がぼやけます。それを使用して作成した UIImage を渡すと、機能しUIGraphicsGetImageFromCurrentImageContext()
ません。これがなぜなのかについてのアイデアはありますか?
更新:
次のようにパテルの提案を試しました:
CALayer *backgroundLayer = [CALayer layer];
CIFilter *blurFilter = [CIFilter filterWithName:@"CIGaussianBlur"];
[blurFilter setDefaults];
backgroundLayer.backgroundFilters = [NSArray arrayWithObject:blurFilter];
[[self.view layer] addSublayer:backgroundLayer];
ただし、機能しません:(
懸賞金が追加されてからの更新:
TomSoft1 の stackblurを使用して BlurBox を正しく動作させることができました。これは、TomSoft1 がその場で画像を RGBA 形式 (32 ビット/ピクセル) に正規化する機能を追加したためです。ただし、それでもかなり遅いです。
BlurBox の下にあるものの画像を取得し、その画像をぼかして画面に表示するために、0.03 秒ごとに更新を呼び出すタイマーがあります。BlurBox の「fps」を上げる方法について教えてください。