我正在使用viewController的viewDidLoad中的以下函数创建模糊效果
func applyBlurEffect(image: UIImage){
        let imageToBlur = CIImage(image: image)!
        let blurfilter = CIFilter(name: "CIGaussianBlur")!
        blurfilter.setValue(10, forKey: kCIInputRadiusKey)
        blurfilter.setValue(imageToBlur, forKey: "inputImage")
        let resultImage = blurfilter.value(forKey: "outputImage") as! CIImage
        let croppedImage: CIImage = resultImage.cropping(to: CGRect(x:0,y: 0,width: imageToBlur.extent.size.width,height: imageToBlur.extent.size.height))
        let context = CIContext(options: nil)
        let blurredImage = UIImage (cgImage: context.createCGImage(croppedImage, from: croppedImage.extent)!)
        self.backImage.image = blurredImage
}但是这段代码会阻塞UI,viewController会在3-4秒的延迟后打开。我不想在没有blurEffect的情况下显示UI,也不想让用户在打开viewController时等待3-4秒。请提供此问题的最佳解决方案。
发布于 2017-01-08 20:24:33
GPUImage (https://github.com/BradLarson/GPUImage)模糊效果确实比CoreImage one快得多:
extension UIImage {
  func imageWithGaussianBlur() -> UIImage? {
    let source = GPUImagePicture(image: self)
    let gaussianFilter = GPUImageGaussianBlurFilter()
    gaussianFilter.blurRadiusInPixels = 2.2
    source?.addTarget(gaussianFilter)
    gaussianFilter.useNextFrameForImageCapture()
    source?.processImage()
    return gaussianFilter.imageFromCurrentFramebuffer()
  }
}然而,小延迟仍然是可能的(取决于图像大小),所以如果你在视图加载之前无法对图像进行预处理,我建议首先调整图像的大小,模糊并显示产生的缩略图,然后在背景队列中处理原始图像后,用模糊的原始图像替换缩略图。
发布于 2017-01-02 16:34:06
性能最佳实践
遵循以下实践以获得最佳性能:
inputImageMaximumSize和outputImageMaximumSize.
CGImageSourceCreateThumbnailAtIndex.
使用更简单的过滤器应用contents factor.
类似于CISepiaTone,并这样做更多的efficiently.
算法需要RBGA数据。在这两者之间进行转换是有成本的
两个。核心镜像支持从CVPixelBuffer对象读取YUB
并应用适当的颜色变换。
也可以看看布拉德·拉尔森的GPUImage。您可能会想要使用它。请参阅此答案。https://stackoverflow.com/a/12336118/1378447
发布于 2017-01-02 21:43:44
你能用原始图像呈现视图控制器,在背景线程上执行模糊,并在模糊的图像准备好后,做一个很好的效果来替换图像吗?
另外,也许你可以使用UIVisualEffectView,看看性能是否更好?
苹果公司不久前也发布了一个使用UIImageEffects进行模糊处理的例子。它是用Obj-C编写的,但在Swift https://developer.apple.com/library/content/samplecode/UIImageEffects/Listings/UIImageEffects_UIImageEffects_h.html中很容易使用它
https://stackoverflow.com/questions/41379539
复制相似问题