如何组合过滤器

nik*_*212 3 xcode core-graphics ios cifilter swift

如何组合图像过滤器?比如我要使用CIColorControls、CINoiseReduction等,是否需要创建几个filter并初始化?或者还有其他方法吗?

var colorControls: CIFilter
var noiseReduction: CIFilter
...

func init() {
   colorControls = CIFilter.init(name: "CIColorControls")!
   noiseReduction = CIFilter.init(name: "CINoiseReduction")!
   ...
}
Run Code Online (Sandbox Code Playgroud)

Vas*_*vev 5

您可以一一应用过滤器:

func filter(image: CIImage) -> CIImage? {
    guard let colorControls = CIFilter(name: "CIColorControls"),
          let noiseReduction = CIFilter(name: "CINoiseReduction") else { return nil }
    colorControls.setValue(image, forKey: kCIInputImageKey)
    ... // add some CIColorControls filter manipulations
    guard let imageWithFirstFilter = colorControls.value(forKey: kCIOutputImageKey) as? CIImage else { return nil }
    noiseReduction.setValue(imageWithFirstFilter, forKey: kCIInputImageKey)
    ... // add some CINoiseReduction filter manipulations
    guard let imageWithBothFilters = noiseReduction.value(forKey: kCIOutputImageKey) as? CIImage else { return nil }
    return imageWithBothFilters
}
Run Code Online (Sandbox Code Playgroud)

有点不同的方式:

func apply(_ filter: CIFilter?, for image: CIImage) -> CIImage {
    guard let filter = filter else { return image }
    filter.setValue(image, forKey: kCIInputImageKey)
    guard let filteredImage = filter.value(forKey: kCIOutputImageKey) else { return image }
    return filteredImage
}
Run Code Online (Sandbox Code Playgroud)

使用:

image = apply(colorControls, for: image)
Run Code Online (Sandbox Code Playgroud)