如何组合过滤器
How to combine filters
如何组合图像滤镜?比如我想使用CIColorControls、CINoiseReduction等,是否需要创建多个过滤器并进行初始化?或者有别的办法吗?
var colorControls: CIFilter
var noiseReduction: CIFilter
...
func init() {
colorControls = CIFilter.init(name: "CIColorControls")!
noiseReduction = CIFilter.init(name: "CINoiseReduction")!
...
}
您可以一个一个地应用过滤器:
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
}
有点不同的方式:
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
}
使用:
image = apply(colorControls, for: image)
如何组合图像滤镜?比如我想使用CIColorControls、CINoiseReduction等,是否需要创建多个过滤器并进行初始化?或者有别的办法吗?
var colorControls: CIFilter
var noiseReduction: CIFilter
...
func init() {
colorControls = CIFilter.init(name: "CIColorControls")!
noiseReduction = CIFilter.init(name: "CINoiseReduction")!
...
}
您可以一个一个地应用过滤器:
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
}
有点不同的方式:
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
}
使用:
image = apply(colorControls, for: image)