2013-08-23 5 views
12

MKMapViewのスクリーンショットに画像効果を適用して、私のガラスにiOS 7スタイルのガラス効果を使用しようとしています。 Appleによって提供されたThis UIImage categoryは、私がベースラインとして使用しているものです。この方法では、元画像を不飽和化する色合いの色を適用し、多額の入力ヴァルスを使用してぼかし:GPUImageを使用してiOS 7のガラス効果を再現する

[image applyBlurWithRadius:10.0 
       tintColor:[UIColor colorWithRed:229/255.0f green:246/255.0f blue:255/255.0f alpha:0.33] 
    saturationDeltaFactor:0.66 
       maskImage:nil]; 

これは私が探しています効果を発揮するが、あまりにも時間がかかり - .3.5秒の間にレンダリングします私は私の予備的な試みとして優れたGPUImageを使用したいiPhone 4

enter image description here

は約5〜10倍高速だったが、私はちょうどそれが右のように見えることはできません。

GPUImagePicture *stillImageSource = [[GPUImagePicture alloc] initWithImage:image]; 

GPUImageSaturationFilter *saturationFilter = [[GPUImageSaturationFilter alloc] init]; 
saturationFilter.saturation = 0.33; // 1.0 - 0.66; 
[stillImageSource addTarget:saturationFilter]; 

GPUImageMonochromeFilter *monochromeFilter = [[GPUImageMonochromeFilter alloc] init]; 
[monochromeFilter setColor:(GPUVector4){229/255.0f, 246/255.0f, 1.0f, 0.33f}]; 
[monochromeFilter setIntensity:0.2]; 
[saturationFilter addTarget:monochromeFilter]; 

GPUImageFastBlurFilter *blurFilter = [[GPUImageFastBlurFilter alloc] init]; 
blurFilter.blurSize = 2; 
blurFilter.blurPasses = 3; 
[monochromeFilter addTarget:blurFilter]; 

[saturationFilter prepareForImageCapture]; 
[monochromeFilter prepareForImageCapture]; 

[stillImageSource processImage]; 
image = [blurFilter imageFromCurrentlyProcessedOutput]; 

これは近い画像を生成ではなく、かなりそこ

enter image description here

ぼかしが十分に深いではないようですが、私は上記のblurSizeを増やそうとしたとき、それ万華鏡のような格子状になります。 2番目の画像を拡大すると、実際にグリッドが表示されます。私が模倣しようとしている色合いは、アップルサンプルが行っていると思うオーバーレイとブレンドの代わりにイメージを洗い落とすようです。

another SO questionの@BradLarsonによるコメントに従ってフィルタを設定しようとしました。 GPUImageフィルタを使用してこのエフェクトを再現していますか、それとも間違って設定していますか?

+0

https://github.com/JagCesar/iOS-blurを試しましたか?それはiOS7の下でのみ動作しますが素晴らしいです。 –

+0

iOS-Blurは実行可能なソリューションではありません。この作業をするためにリンゴが何をしているのか分かりませんし、iOS 6ではうまくいきません。 – coneybeare

答えて

32

私はここで何か作業をしていましたが、やっと機能しました。 GPUImageのぼかしフィルタをフレームワークにいくつか変更しました。その結果、コントロールセンタービューのようなものに対して、Appleのぼかし効果の妥当な複製があると思います。

以前のフレームでは、あらかじめ計算された1つの半径しか使わなかったため、強度に影響を与える唯一の方法は、入力画像からピクセルをサンプリングした間隔を調整することでした。ピクセルあたりのサンプル数が限られているため、サンプリングされたピクセル間の間隔の倍数を1.5よりも大きく変更すると、ピクセルがスキップされると深刻なブロックアーチファクトが発生し始めました。

私が作成した新しいガウスブラーの実装では、事前計算されたガウスウェイトのパフォーマンス上の利点と、ガウスブラーの任意の半径(シグマ)を使用できる機能が組み合わされています。これは、さまざまな半径に必要なシェーダーをオンザフライで生成することで行います。また、ハードウェア補間を使用して、各サンプルポイントに対して2つのテクセルを一度に読み取ることによって、所定のぼかし半径に必要なテクスチャサンプルの数を減らします。

新しいGPUImageiOSBlurFilterは、この調整された任意半径のガウシアンぼかしフィルタと、ぼかし処理後の色にAppleが実行する調整を複製するように見える色補正フィルタを組み合わせています。私は私の答えhereとの比較の下に追加しましたが、それはAppleの内蔵左側のコントロールセンタービューからぼかしを示し、右の私の新しいGPUImageぼかしフィルタ:方法として

Apple's blurGPUImage's blur

(アップルのぼかしは48ピクセルで発生するように見えますが、各ピクセルごとにかなり大きな領域が必要です)、私はガウスのぼかしの前に4倍のダウンサンプリングを行い、その後4倍のアップサンプリングを行います。これにより、16倍のぼかしが必要なピクセル数が減少し、ぼかしシグマも48から12に減少します。iPhone 4Sは、このフィルタを使用して約30msで画面全体をぼかすことができます。

ぼかしの権利を取得することが1つです。アップルは依然としてビューの背後にある画像コンテンツをすばやく入手する方法を提供していないため、急速に変化するコンテンツに対してはボトルネックになりがちです。

+1

私は 'GPUImageiOSBlurFilter'に切り替えました。私はライブぼかしには使用しませんが、 'UITableViewCell'で表示する画像をぼかすために必要なので、すばやくそれがあります。ありがとう! – runmad

+0

Brad、GPUImageのポッドスペックを更新できますか?古い0.1.1仕様には 'GPUImageiOSBlurFilter'は含まれていません。ありがとう! –

+0

@KyrDunenkoff - あなたはCocoaPodsを指していると思いますか?私はそこに何かを維持したり、自分でCocoaPodを使用したりすることはありません。だからリポジトリの最新のビルドを指し示すのは誰かの責任です。私はGitHubリポジトリを維持しています。最新のコードが必要な場合は、GitHubから直接引き出すことをお勧めします。 –

関連する問題