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)))
我尝试对我的 CI 图片实施一些 CI 过滤器,但其中一个一直崩溃。 CISmoothLinearGradient 给出以下错误,但我不明白它有什么问题。我尝试做的是获取图像中的某些区域,并根据它们的平均颜色在它们之间创建平滑的线性渐变。
错误代码:
原因:'[
是否有语法错误?请在下面查看我的代码:
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)))