如何将CIFilter应用于UIView?

时间:2017-09-08 11:40:01

标签: ios objective-c swift uiview cifilter

根据 Apple docs, CALayer不支持iOS的过滤器属性。我正在使用其中一个应用CIFilterUIView的应用程序,即Splice,Video Editor Videos for FX for Funimate和artisto。这意味着我们可以将CIFilter应用于UIView

我使用了SCRecorder库并尝试通过SCPlayerSCFilterImageView完成此任务。但是,在应用CIFilter后播放视频时,我面临黑屏问题。请帮助我完成此任务,以便我可以将CIFilter应用于UIView,也可以通过点击UIButton来更改过滤器。

1 个答案:

答案 0 :(得分:5)

技术上准确的答案是CIFilter需要CIImage。您可以将UIView转换为UIImage,然后将其转换为CIImage,但使用图像进行输入的所有CoreImage过滤器(有些生成新图像)使用`用于输入和输出的CIImage。

  • 请注意CIImage的来源是左下角,而不是左上角。基本上Y轴是翻转的。
  • 如果您动态使用CoreImage过滤器,请学习使用GLKView进行渲染 - 它使用的是UIImageView使用CPU的GPU。
  • 如果您想测试过滤器,最好使用实际设备。模拟器将为您提供非常的糟糕性能。我已经看到一个简单的模糊需要将近一分钟的时间,在设备上它将只有一秒钟!

我们假设您有一个UIView,您希望将CIPhotoEffectMono应用于UIView。执行此操作的步骤如下:

  • CIImage转换为CIImage
  • 应用过滤器,输出CIContext
  • 使用CGImage创建UIImage,然后将其转换为UIView

这是一个UIImage扩展程序,可将视图的所有子视图转换为extension UIView { public func createImage() -> UIImage { UIGraphicsBeginImageContextWithOptions( CGSize(width: self.frame.width, height: self.frame.height), true, 1) self.layer.render(in: UIGraphicsGetCurrentContext()!) let image = UIGraphicsGetImageFromCurrentImageContext() UIGraphicsEndImageContext() return image! } }

UIImage

CIImage转换为let ciInput = CIImage(image: myView.createImage) 是一行代码:

UIImage

这是一个将应用过滤器并返回func convertImageToBW(image:UIImage) -> UIImage { let filter = CIFilter(name: "CIPhotoEffectMono") // convert UIImage to CIImage and set as input let ciInput = CIImage(image: image) filter?.setValue(ciInput, forKey: "inputImage") // get output CIImage, render as CGImage first to retain proper UIImage scale let ciOutput = filter?.outputImage let ciContext = CIContext() let cgImage = ciContext.createCGImage(ciOutput!, from: (ciOutput?.extent)!) return UIImage(cgImage: cgImage!) }

的函数
switch