我是使用GPUImage的初学者。
我注意到当我使用滑块捕获并调整GPUImageGaussianSelectiveBlurFilter
和blurRadiusInPixels
时应用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)
}
}
}
答案 0 :(得分:0)
在updateFilterParameters()
中,无需删除和重新添加目标。您的过滤器管道不会更改,只会更改参数。这可能会导致一些放缓。将该方法修改为以下内容:
@IBAction func updateFilterParameters() {
filter?.blurRadiusInPixels = CGFloat(blurSlider.value)
filter?.excludeCircleRadius = CGFloat(focusSlider.value) / 320
imageSource?.processImage()
}
作为一个更大的问题,如果图像大于预览视图的大小,您可能不希望为实时预览处理全尺寸图像。我建议在第一阶段过滤器上使用forceProcessingAtSize
将其分辨率降低到预览视图的输出大小(以像素为单位)。这样,您只处理实际显示的像素,这对于大图像会产生巨大的差异。
您需要调整模糊半径(以像素为单位)以相对于新的缩小尺寸,以便预览与最终结果相匹配,然后当您想要捕获最终的全尺寸滤镜图像以便保存到您需要将forceProcessingAtSize
设置回原始图像分辨率并重新运行过滤进程。