ios - 在相机捕获和图像编辑时使用 GPUImage GaussianSelective Blur Filter

标签 ios swift gpuimage

我是使用 GPUImage 的初学者。
我注意到,当我在捕获和调整 blurRadiusInPixelsexcludeCircleRadius 时应用 GPUImageGaussianSelectiveBlurFilter 使用 slider ,滤镜应用顺利,没有明显的延迟。
但是,当我编辑图像并使用上述参数应用滤镜时,处理图像会出现非常明显的延迟。

这是我的代码:

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

当用户已经从相机胶卷中选择图像时,将显示此 View Controller 。

这是打开所述 View Controller 的代码。请注意,它来自另一个 View Controller :

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

最佳答案

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

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

    imageSource?.processImage()
}

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

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

关于ios - 在相机捕获和图像编辑时使用 GPUImage GaussianSelective Blur Filter,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40013753/

相关文章:

ios - 将此字符串转换为 NSDate

ios - 从扩展目标访问主 App 类 - iOS

swift - 使用 NSDate() 进行 Realm 查询时出错

iOS - 在其他 View 之上设置模糊图像,奇怪的问题

iphone - 如何在 iphone 中找到图像的颜色边缘?

iOS 从 GPUImage 捕获图像

ios - 对 NSURLRequest 进行排队以模拟同步、阻塞请求

iOS 状态恢复日志警告而不是在模拟器中运行

ios - 如何更改 UINavigationBar 的字体和颜色?

string - 将字符串拆分为特定长度的组