根据 Apple docs,
,CALayer
不支持iOS
的过滤器属性。我正在使用其中一个应用CIFilter
到UIView
的应用程序,即Splice,Video Editor Videos for FX for Funimate和artisto。这意味着我们可以将CIFilter
应用于UIView
。
我使用了SCRecorder
库并尝试通过SCPlayer
和SCFilterImageView
完成此任务。但是,在应用CIFilter
后播放视频时,我面临黑屏问题。请帮助我完成此任务,以便我可以将CIFilter
应用于UIView
,也可以通过点击UIButton来更改过滤器。
答案 0 :(得分:5)
技术上准确的答案是CIFilter
需要CIImage
。您可以将UIView
转换为UIImage
,然后将其转换为CIImage
,但使用图像进行输入的所有CoreImage过滤器(有些生成新图像)使用`用于输入和输出的CIImage。
CIImage
的来源是左下角,而不是左上角。基本上Y轴是翻转的。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