首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在viewDidLoad blocks中对图像使用GaussianBlur

在viewDidLoad blocks中对图像使用GaussianBlur
EN

Stack Overflow用户
提问于 2016-12-29 20:14:35
回答 4查看 511关注 0票数 1

我正在使用viewController的viewDidLoad中的以下函数创建模糊效果

代码语言:javascript
运行
复制
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秒。请提供此问题的最佳解决方案。

EN

回答 4

Stack Overflow用户

发布于 2017-01-08 20:24:33

GPUImage (https://github.com/BradLarson/GPUImage)模糊效果确实比CoreImage one快得多:

代码语言:javascript
运行
复制
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()
  }
}

然而,小延迟仍然是可能的(取决于图像大小),所以如果你在视图加载之前无法对图像进行预处理,我建议首先调整图像的大小,模糊并显示产生的缩略图,然后在背景队列中处理原始图像后,用模糊的原始图像替换缩略图。

票数 1
EN

Stack Overflow用户

发布于 2017-01-02 16:34:06

Core Image Programming Guide

性能最佳实践

遵循以下实践以获得最佳性能:

  • 不要在每次渲染时都创建CIContext对象。上下文存储了大量的状态信息;重用它们会更有效率。
  • 会评估你的应用程序是否需要色彩管理。除非你需要,否则不要使用它。请参见Does App Need Color Management?在使用图形处理器上下文渲染CIImage对象时,避免核心动画动画。如果您需要同时使用两者,您可以将两者都设置为使用CPU。
  • 确保图像不会超过CPU和GPU的限制。CIContext对象的图像大小限制根据核心图像使用的是中央处理器还是图形处理器而有所不同。使用下面的方法检查限制

inputImageMaximumSize和outputImageMaximumSize.

  • User在可能的情况下缩小图像。性能随输出像素数的增加而变化。可以将核心图像渲染到较小的视图、纹理或帧缓冲区中。允许核心动画放大以显示大小。

  • 使用核心图形或图像I/O函数来裁剪或缩减采样,如函数CGImageCreateWithImageInRect或

CGImageSourceCreateThumbnailAtIndex.

  • The UIImageView类最适合处理静态图像。如果您的应用需要获得最佳性能,请使用较低级别的app。

  • 避免在CPU和GPU之间进行不必要的纹理传输。渲染到与之前的源图像大小相同的矩形

使用更简单的过滤器应用contents factor.

  • Consider,它可以产生类似于算法过滤器的结果。例如,CIColorCube可以生成输出

类似于CISepiaTone,并这样做更多的efficiently.

  • Take优势,在iOS 6.0和更高版本中的支持YUV图像。相机像素缓冲区是原生的YUV,但大多数图像处理

算法需要RBGA数据。在这两者之间进行转换是有成本的

两个。核心镜像支持从CVPixelBuffer对象读取YUB

并应用适当的颜色变换。

也可以看看布拉德·拉尔森的GPUImage。您可能会想要使用它。请参阅此答案。https://stackoverflow.com/a/12336118/1378447

票数 0
EN

Stack Overflow用户

发布于 2017-01-02 21:43:44

你能用原始图像呈现视图控制器,在背景线程上执行模糊,并在模糊的图像准备好后,做一个很好的效果来替换图像吗?

另外,也许你可以使用UIVisualEffectView,看看性能是否更好?

苹果公司不久前也发布了一个使用UIImageEffects进行模糊处理的例子。它是用Obj-C编写的,但在Swift https://developer.apple.com/library/content/samplecode/UIImageEffects/Listings/UIImageEffects_UIImageEffects_h.html中很容易使用它

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41379539

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档