如何有效地应用 GPUImage 过滤器?
How To Apply GPUImage filters efficiently?
在我的项目中,我将颜色应用于图像,然后在一秒钟后我将 Kuwahara 滤镜应用于它,以获得水彩效果,但问题是应用滤镜需要时间,如果我也更改颜色许多应用程序最终由于内存问题而崩溃。任何人都可以帮助我如何以最佳方式使用过滤器。谢谢
代码
@objc func fillColorButtonTapped(_ sender : UIButton){
self.processingModel.isImageMixedColor = false
if let popoverController = self.mkColorPicker.popoverPresentationController{
popoverController.delegate = self.mkColorPicker
popoverController.permittedArrowDirections = .any
popoverController.sourceView = sender
popoverController.sourceRect = sender.bounds
}
self.present(self.mkColorPicker, animated: true, completion: nil)
self.mkColorPicker.selectedColor = { [weak self] color in
guard let strongSelf = self else {
return
}
let image = ChangeColor.image(byReplacingColor: strongSelf.processingModel.pencileDefaultImage, withSourceColor: .black, withMinTolerance: 0.4, withMaxTolerance: 0.5, with: color)
strongSelf.processingModel.croppedImageToWorkOn = image
UIView.transition(with: strongSelf.handAndFootImageView,
duration: 0.2,
options: .transitionCrossDissolve,
animations: {strongSelf.handAndFootImageView.image = strongSelf.processingModel.croppedImageToWorkOn},
completion: nil)
strongSelf.addWaterColorEffect()
}
}
func addWaterColorEffect(withRadius : Int = 5){
CommonClass.delayWithSeconds(0.5, completion: {
let filter = KuwaharaFilter()
filter.radius = withRadius
let imageToFilter = self.containerView.toImage()
DispatchQueue.main.async {
let imageToShow = imageToFilter.filterWithOperation(filter)
UIView.transition(with: self.handAndFootImageView,
duration: 0.6,
options: .transitionCrossDissolve,
animations: {self.handAndFootImageView.image = imageToShow },
completion: nil)
self.processingModel.croppedImageToWorkOn = imageToShow
}
})
}
这就是我根据我认为您所追求的,在 swift 中使用 GPUImage2 简单地设置过滤器的方式。图像进入滤色器,然后进入溶解混合的源 1(混合 0.0)。然后将彩色滤光片送入桑原滤光片,然后送入溶解混合物的来源 2。从那里你可以在两者之间转换并根据需要改变半径。
func setupFilters() {
image --> colorFilter --> dissolveBlend
colorFilter --> kuwaharaFilter --> dissolveBlend --> renderView
dissolveBlend.mix = 0.0
}
func addWaterColorEffect(withRadius : Int = 5){
kuwaharaFilter.radius = withRadius
dissolveBlend.mix = 1.0
// This will not give you a transition but you can use a while loop or timer
// to change the mix over the course of whatever length of time you are seeking.
}
在我的项目中,我将颜色应用于图像,然后在一秒钟后我将 Kuwahara 滤镜应用于它,以获得水彩效果,但问题是应用滤镜需要时间,如果我也更改颜色许多应用程序最终由于内存问题而崩溃。任何人都可以帮助我如何以最佳方式使用过滤器。谢谢
代码
@objc func fillColorButtonTapped(_ sender : UIButton){
self.processingModel.isImageMixedColor = false
if let popoverController = self.mkColorPicker.popoverPresentationController{
popoverController.delegate = self.mkColorPicker
popoverController.permittedArrowDirections = .any
popoverController.sourceView = sender
popoverController.sourceRect = sender.bounds
}
self.present(self.mkColorPicker, animated: true, completion: nil)
self.mkColorPicker.selectedColor = { [weak self] color in
guard let strongSelf = self else {
return
}
let image = ChangeColor.image(byReplacingColor: strongSelf.processingModel.pencileDefaultImage, withSourceColor: .black, withMinTolerance: 0.4, withMaxTolerance: 0.5, with: color)
strongSelf.processingModel.croppedImageToWorkOn = image
UIView.transition(with: strongSelf.handAndFootImageView,
duration: 0.2,
options: .transitionCrossDissolve,
animations: {strongSelf.handAndFootImageView.image = strongSelf.processingModel.croppedImageToWorkOn},
completion: nil)
strongSelf.addWaterColorEffect()
}
}
func addWaterColorEffect(withRadius : Int = 5){
CommonClass.delayWithSeconds(0.5, completion: {
let filter = KuwaharaFilter()
filter.radius = withRadius
let imageToFilter = self.containerView.toImage()
DispatchQueue.main.async {
let imageToShow = imageToFilter.filterWithOperation(filter)
UIView.transition(with: self.handAndFootImageView,
duration: 0.6,
options: .transitionCrossDissolve,
animations: {self.handAndFootImageView.image = imageToShow },
completion: nil)
self.processingModel.croppedImageToWorkOn = imageToShow
}
})
}
这就是我根据我认为您所追求的,在 swift 中使用 GPUImage2 简单地设置过滤器的方式。图像进入滤色器,然后进入溶解混合的源 1(混合 0.0)。然后将彩色滤光片送入桑原滤光片,然后送入溶解混合物的来源 2。从那里你可以在两者之间转换并根据需要改变半径。
func setupFilters() {
image --> colorFilter --> dissolveBlend
colorFilter --> kuwaharaFilter --> dissolveBlend --> renderView
dissolveBlend.mix = 0.0
}
func addWaterColorEffect(withRadius : Int = 5){
kuwaharaFilter.radius = withRadius
dissolveBlend.mix = 1.0
// This will not give you a transition but you can use a while loop or timer
// to change the mix over the course of whatever length of time you are seeking.
}