根据 Apple docs,
iOS
中不支持CALayer
的过滤属性。当我使用的一个应用程序中的一个应用程序将CIFilter
应用于UIView
,即剪接,视频编辑器Videoshow fx for Funimate and Astriveo。这意味着我们可以将CIFilter
应用于UIView
。
我已经使用了SCRecorder
库,并尝试通过SCPlayer
和SCFilterImageView
完成此任务。但是,当视频播放CIFilter
之后,我将面临黑屏问题。因此,请帮助我完成此任务,以便我可以将CIFilter
应用于UIView
,并且可以通过单击UIBUTTON来更改过滤器。
技术上准确的答案是CIFilter
需要CIImage
。您可以将UIView
转换为UIImage
,然后将其转换为CIImage
,但是所有使用图像进行输入的核心图过滤器(有些生成新映像)使用`ciimage用于输入和输出。
- 请注意,
CIImage
的原点是左下,而不是左上。基本上y轴被翻转。 - 如果您动态使用CoreImage过滤器,请学习使用
GLKView
渲染 - 它使用gpu,其中UIImageView
使用CPU。 - 如果要测试过滤器,最好使用实际设备。模拟器会给您非常的性能差。我已经看到一个简单的模糊需要将近一分钟的时间,在设备上,这将是一秒钟的一小部分!
假设您有一个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!)
}