我是使用 GPUImage 的初学者。
我注意到,当我在捕获和调整 blurRadiusInPixels
和 excludeCircleRadius 时应用
使用 slider ,滤镜应用顺利,没有明显的延迟。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()
}
当用户已经从相机胶卷中选择图像时,将显示此 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/