2016-10-13 3 views
0

私はGPUImageを使用する初心者です。
blurRadiusInPixelsexcludeCircleRadiusをスライダでキャプチャして調整しているときにGPUImageGaussianSelectiveBlurFilterを適用すると、フィルタはスムーズに適用され、大きな遅延は見られませんでした。
しかし、私が画像を編集して、上記のパラメータでフィルタを適用すると、画像の処理に非常に大きな遅延があります。GPUImageGaussianSelectiveBlurFilterをカメラキャプチャと画像編集の間に使用する

はここに私のコードである:

... 
@IBOutlet weak var photoView: GPUImageView! 

var filter: GPUImageGaussianSelectiveBlurFilter? 
var imageSource: GPUImagePicture? 
... 
override func viewDidLoad() { 
    super.viewDidLoad() 

    photoView.fillMode = kGPUImageFillModePreserveAspectRatioAndFill 
    ... 
    filter = GPUImageGaussianSelectiveBlurFilter() 
    filter?.aspectRatio = 1 
    filter?.addTarget(photoView) 

    imageSource = GPUImagePicture(image: image!, smoothlyScaleOutput: true) 
    imageSource?.addTarget(filter) 
    imageSource?.processImage() 
    ... 
} 
... 
// This the callback method when the value of the slider is changed. 
@IBAction func updateFilterParameters() { 
    filter?.removeAllTargets() 
    imageSource?.removeAllTargets() 

    filter?.blurRadiusInPixels = CGFloat(blurSlider.value) 
    filter?.excludeCircleRadius = CGFloat(focusSlider.value)/320 
    filter?.addTarget(photoView) 

    imageSource?.addTarget(filter) 
    imageSource?.processImage() 
} 

ユーザが既にカメラロールから画像を選択した場合、このビューコントローラが提示されます。

ここに、前記ビューコントローラを開くコードがあります。これは、他のビューコントローラから存在することに注意してください:

... 
var photoEditor: EditorViewController? 
... 
func openPhotoEditor(image: UIImage?) { 
    if image != nil { 
     photoEditor = storyboard?.instantiateViewController(withIdentifier: "EditorVC") as? EditorViewController 
     photoEditor?.image = image! 
     photoEditor?.delegate = self 
     present(photoEditor!, animated: true, completion: nil) 
    } 
} 
... 
extension ViewController: UIImagePickerControllerDelegate, UINavigationControllerDelegate { 

    func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) { 
     let image = info[UIImagePickerControllerOriginalImage] as? UIImage 
     picker.dismiss(animated: false) { 
      self.openPhotoEditor(image: image) 
     } 
    } 
} 
+0

どのくらいの遅延が効きますか? –

+0

4-8秒に似ています。 – mownier

+0

私にあなたのメールIDを教えたら、デモを転送します。このデモが表示されるはずです –

答えて

0

updateFilterParameters()では、削除して、ターゲットを再度追加する必要はありません。フィルタパイプラインは変更されておらず、パラメータだけです。これはおそらくいくつかの減速の原因となります。以下にその方法をリワーク:そのイメージは、プレビュービューのサイズよりも大きい場合には、より大きな問題として

@IBAction func updateFilterParameters() { 
    filter?.blurRadiusInPixels = CGFloat(blurSlider.value) 
    filter?.excludeCircleRadius = CGFloat(focusSlider.value)/320 

    imageSource?.processImage() 
} 

、おそらくあなたのライブプレビューのためのフルサイズの画像を処理することにしたくありません。初段のフィルタでforceProcessingAtSizeを使用して、解像度をプレビュービューの出力サイズ(ピクセル単位)に縮小することをおすすめします。そうすれば、実際に表示されているピクセルのみを処理しているため、大きな画像に大きな違いが生じます。

ぼかし半径をピクセル単位で調整して、新しい縮小サイズを基準にして、プレビューが最終結果と一致するようにしてから、最終サイズのフィルタリングされた保存画像をキャプチャする必要がありますディスクに転送する場合は、forceProcessingAtSizeを元のイメージ解像度に戻してフィルタ処理を再実行します。

関連する問題