【问题标题】:CISmoothLinearGradient Filter crashingCISmoothLinearGradient 过滤器崩溃
【发布时间】:2020-11-05 08:16:56
【问题描述】:

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

错误代码: 原因:'[ setValue:forUndefinedKey:]:这个类不符合键值编码的键输入图像

是否存在语法错误?请参阅下面的代码:

                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] )

【问题讨论】:

    标签: cifilter


    【解决方案1】:

    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)))
    

    【讨论】:

    • 好的,谢谢。我没有意识到这一点。但是如何使用 CISmoothLinearGradient 生成新图像?我找不到任何显示如何使用此过滤器的示例代码。我可以设置参数但无法生成输出图像。 ?
    • 非常感谢。第二种选择在裁剪后效果很好。我很好奇如何将过滤器用作无限范围。当我尝试将渐变与我的 CI 图像混合时,它崩溃了。我猜下面的评论不适用于无限 CIimage var trialImage = blendKernel.apply(foreground: maskCI!, background: gradientI!)
    • blendKernel 的输出也将具有无限范围。您基本上是将图像 (maskCI) 放置在无限壁纸 (gradient) 上。因此,您需要在渲染结果之前的某个时间点对其进行裁剪,因为您的渲染目标将是有限的,并且您需要告诉 Core Image 您要显示无限图像的哪一部分。
    • 好的,我现在明白了。我的错误是将混合内核的结果转换为 UIimage 并尝试显示它。非常感谢??
    猜你喜欢
    • 1970-01-01
    • 2023-04-05
    • 2019-03-08
    • 2023-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多