相机捕捉与图像编辑时使用GPUImageGaussianSelectiveBlurFilter

时间:2016-10-13 06:27:36

标签: ios swift gpuimage

我是使用GPUImage的初学者。
我注意到当我使用滑块捕获并调整GPUImageGaussianSelectiveBlurFilterblurRadiusInPixels时应用excludeCircleRadius时,滤波应用平滑且无明显延迟。
但是,当我编辑图像并使用上述参数应用滤波器时,处理图像会有非常明显的延迟。

这是我的代码:

...
@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)
        }
    }
}

1 个答案:

答案 0 :(得分:0)

updateFilterParameters()中,无需删除和重新添加目标。您的过滤器管道不会更改,只会更改参数。这可能会导致一些放缓。将该方法修改为以下内容:

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

    imageSource?.processImage()
}

作为一个更大的问题,如果图像大于预览视图的大小,您可能不希望为实时预览处理全尺寸图像。我建议在第一阶段过滤器上使用forceProcessingAtSize将其分辨率降低到预览视图的输出大小(以像素为单位)。这样,您只处理实际显示的像素,这对于大图像会产生巨大的差异。

您需要调整模糊半径(以像素为单位)以相对于新的缩小尺寸,以便预览与最终结果相匹配,然后当您想要捕获最终的全尺寸滤镜图像以便保存到您需要将forceProcessingAtSize设置回原始图像分辨率并重新运行过滤进程。