如何将Cifilter应用于Uiview



根据 Apple docs, iOS中不支持CALayer的过滤属性。当我使用的一个应用程序中的一个应用程序将CIFilter应用于UIView,即剪接,视频编辑器Videoshow fx for Funimate and Astriveo。这意味着我们可以将CIFilter应用于UIView

我已经使用了SCRecorder库,并尝试通过SCPlayerSCFilterImageView完成此任务。但是,当视频播放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!)
}

最新更新