21

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」を上げる方法について教えてください。

4

5 に答える 5

7

返信が遅くなるかもしれませんが、コア画像フィルターを利用できます。遅い理由はこの行です。

CIContext *context = [CIContext contextWithOptions:nil];

Appleのドキュメントでは、Core Imageで最高のパフォーマンスを得るために、最初に述べています

CIContext「レンダリングするたびにオブジェクトを作成しないでください。コンテキストには多くの状態情報が保存されています。それらを再利用する方が効率的です。」

これに対する私の個人的な解決策は、コア イメージ コンテキストのシングルトンを作成することです。だから私は1つしか作成しません。

私のコードは、GitHub のこのデモ プロジェクトにあります。

https://github.com/KyleLopez/DemoCoreImage

自由に使用するか、好みに合わせて別のソリューションを見つけてください。CoreImage で見つけた最も遅い部分はコンテキストです。その後の画像処理は非常に高速です。

于 2013-08-25T22:57:54.177 に答える
1

私はこれをテストしていませんがCALayer、ボックスをぼかしたい場所に配置して、CIFilterに設定できる便利なものを見つけることができるかどうか疑問に思いますCALayer's backgroundFilters。ちょっとした考え。

CALayer.backgroundFiltersを参照してください

于 2012-09-04T21:26:37.087 に答える
0

このライブラリを試しましたか:

https://github.com/gdawg/uiimage-dsp

vDSP/Accelerate フレームワークを使用しており、使いやすいようです。

ところで: 0.01 秒は速すぎるようです。0.03も同様に行う必要があります。

于 2012-09-04T20:54:40.333 に答える
0

Apple Core Image Filter (CIFilter) の一連のルーチンを試すことができます。iOS 5 が必要なため、使用できない場合があります。

あなたが試した方法よりも速いかどうかはわかりませんが、過去にプロジェクトで使用したことがありますが、非常にうまく機能します。ぼやけさせたい画面の部分をつかみ、それを画像に入れ、フィルターを通過させてから、画面の適切な場所に再表示できる場合、それは機能するはずです.

フィルタを使用して画像の色をリアルタイムで変更したところ、うまくいきました。

http://developer.apple.com/library/ios/#DOCUMENTATION/GraphicsImaging/Reference/QuartzCoreFramework/Classes/CIFilter_Class/Reference/Reference.html

于 2012-09-04T20:54:12.230 に答える