CISmoothLinearGradient 过滤器崩溃

CISmoothLinearGradient Filter crashing

我尝试对我的 CI 图片实施一些 CI 过滤器,但其中一个一直崩溃。 CISmoothLinearGradient 给出以下错误,但我不明白它有什么问题。我尝试做的是获取图像中的某些区域,并根据它们的平均颜色在它们之间创建平滑的线性渐变。

错误代码: 原因:'[ setValue:forUndefinedKey:]:此 class 与键 inputImage[= 的键值编码不兼容11=]

是否有语法错误?请在下面查看我的代码:

                let ROIV1 = CGRect(x: 0, y: 55, width: (histogramImage?.size.width)!, height: 5)
                
                let ROIV2 = CGRect(x: 0, y: 60, width: (histogramImage?.size.width)!, height: 5)

                let newPic1 = maskCI!.cropped(to: ROIV1)
                
                let newPic1UI = maskEdit.convert(cmage: newPic1)
                
                let newPic2 = maskCI!.cropped(to: ROIV2)
                
                let newPic2UI = maskEdit.convert(cmage: newPic2)
                
                let average1 = newPic1UI.averageColor
                
                let average2 = newPic2UI.averageColor

                maskCI = maskCI?.applyingFilter("CISmoothLinearGradient", parameters: ["inputPoint0" :  CIVector(x:0,y:50), "inputPoint1": CIVector(x: 299,y:65),"inputColor0": CIColor(color: average1!),"inputColor1": CIColor(color: average2!)])
                
                maskCI = maskCI?.applyingFilter("CIExposureAdjust", parameters: ["inputEV": 0.04] )

CISmoothLinearGradient 不需要输入图像(因此没有具有该名称的 属性)。参见 here。它是一个生成器,这意味着它将从头开始生成一个新图像(在本例中为颜色渐变)。

方法 ciImage.applyingFilter("<name>", parameters: [<params>]) 是以下内容的快捷方式:

let filter = CIFiter(name: "<name>")
filter.setValue(ciImage, forKey: "inputImage")
filter.setValuesForKeys([<params>])
return filter.outputImage

所以这会获取您正在调用它的图像并将其设置为过滤器的 inputImage,这在这种情况下不起作用。

您可以像这样生成渐变图像:

let gradientFilter = CIFilter(name: "CISmoothLinearGradient", parameters: [
    "inputPoint0":  CIVector(x:0,y:50),
    "inputPoint1": CIVector(x: 299,y:65),
    "inputColor0": CIColor(color: average1!),
    "inputColor1": CIColor(color: average2!)]))
let gradient = gradientFilter.outputImage

或者,如果您仅支持 iOS 13 并且更喜欢类型安全的版本:

import CoreImage.CIFilterBuiltins

let filter = CIFilter.smoothLinearGradient()
filter.color0 = CIColor(color: average1!)
filter.color1 = CIColor(color: average2!)
filter.point0 = CGPoint(x: 0, y: 50)
filter.point1 = CGPoint(x: 299, y: 65)
let gradient = filter.outputImage

请注意,生成的图像将具有(几乎)无限的范围(它在所有方向上无限生成)。这通常是您稍后使用它进行混合时想要的。但是如果你需要它是一定的尺寸,你可以根据你的需要裁剪它:

let croppedGradient = gradient.cropped(to: CGRect(origin: .zero, size: CGSize(width: 500, height: 500)))