Swift 如何修改自定义CIFilter的输入键?

Swift 如何修改自定义CIFilter的输入键?,swift,Swift,我正在尝试创建自定义CIFilter。到目前为止,这个滤镜只是使一个图像变亮,这并不是我真正想要的,但我这样做是为了看看我是否能让它工作。虽然过滤器使用的是一个设置值inputBlurRadius,但我不知道如何更改它,以便用户可以更改该值。这是自定义过滤器 import Foundation import UIKit public class CustomFilter: CIFilter { var inputImage: CIImage? private var kerne

我正在尝试创建自定义CIFilter。到目前为止,这个滤镜只是使一个图像变亮,这并不是我真正想要的,但我这样做是为了看看我是否能让它工作。虽然过滤器使用的是一个设置值inputBlurRadius,但我不知道如何更改它,以便用户可以更改该值。这是自定义过滤器

import Foundation
import UIKit

public class CustomFilter: CIFilter {
    var inputImage: CIImage?
    private var kernel: CIColorKernel!
    var inputBrightness: CGFloat = 0.4

override public var outputImage: CIImage!
{
    guard let inputImage = inputImage
        else
    {
        return nil
    }

    let extent = inputImage.extent

    let blur = createCustomKernel4().apply(
        withExtent: inputImage.extent,
        roiCallback:
        {
            (index, rect) in
            return rect
    },
        arguments: [inputImage, inputBrightness as AnyObject])

    return blur!.cropping(to: extent)
}

func createCustomKernel4() -> CIColorKernel {
    let kernelString =
        "kernel vec4 brightenEffect (sampler src , float k) { \n " +
            " vec4 currentSource = sample (src, samplerCoord (src));" +
            "currentSource.rgb = currentSource.rgb + k * currentSource.a;" +
            "return currentSource; \n " +
    "}"
    return CIColorKernel(string: kernelString)!
    //brigtens an image
}
}


 class CustomFiltersVendor: NSObject, CIFilterConstructor
{
     static func registerFilters()
     {
    CIFilter.registerName(
        "CustomFilter",
        constructor: CustomFiltersVendor(),
        classAttributes: [
            kCIAttributeFilterCategories: ["CustomFilters"]
        ])
}

func filter(withName name: String) -> CIFilter?
{
    switch name
    {
    case "CustomFilter":
        return CustomFilter()

    default:
        return nil
    }
}
}
在我想要使用它的文件中,我有

let filter3 = CustomFilter()
filter3.setValue(coreImage, forKey: kCIInputImageKey)
filter3.inputKeys
let outputImage = filter3.outputImage!

我确实在inputKeys中看到inputBrightness,但我不知道如何修改它?我该怎么做呢?

回答晚了,但我刚刚遇到了这个问题。如果没有,请使用子类
CIFilter

内核代码意味着您希望为
float k
传递一个值。假设您希望将其命名为
inputBrightnessFactor
。下面是您在子类中需要的内容:

class CustomFilter:CIFilter {

    let kernel = CIColorKernel(source: 
        "kernel vec4 brightenEffect (sampler src , float k) { \n " +
            "vec4 currentSource = sample (src, samplerCoord (src));" +
            "currentSource.rgb = currentSource.rgb + k * currentSource.a;" +
            "return currentSource; \n " +
        "}")
    var inputImage:CIImage!
    var inputBrightnessFactor:Float = 1

    override var attributes: [String : Any] {
        return [
            kCIAttributeFilterDisplayName: "My Custom Filter",

            "inputImage": [kCIAttributeIdentity: 0,
                           kCIAttributeClass: "CIImage",
                           kCIAttributeDisplayName: "Image",
                           kCIAttributeType: kCIAttributeTypeImage],

            "inputBrightnessFactor": [kCIAttributeIdentity: 0,
                                      kCIAttributeClass: "NSNumber",
                                      kCIAttributeDisplayName: "Brightness Factor",
                                      kCIAttributeDefault: 0,
                                      kCIAttributeMin: 0,
                                      kCIAttributeSliderMin: 0,
                                      kCIAttributeSliderMax: 1,
                                      kCIAttributeType: kCIAttributeTypeScalar]
        ]
    }

    override init() {
        super.init()
    }

    override func setValue(_ value: Any?, forKey key: String) {
        switch key {
            case "inputImage":
                inputImage = value as! CIImage
            case "inputBrightnessFactor":
                inputBrightnessFactor = value as! Float
            default:
                break
        }
    }

    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }

    override var outputImage: CIImage {
        return kernel!.apply(extent: inputImage.extent, arguments: [inputImage as Any, inputBrightnessFactor as Any])!
    }
}
需要注意的两个关键事项:

  • 您可以覆盖
    属性
    ,以注册过滤器和属性的显示值,并为属性提供默认值
  • 您可以覆盖
    设置值(forKey:)
    ,以便像使用任何其他过滤器一样使用它
用法(确保首先运行
CustomFilters.registerFilters()
):

请注意,您现在将内核视为任何其他
CIFilter


希望你已经开始工作了,但是如果没有,你应该去做。

我已经开始工作了,但是谢谢你写了一个解决方案!
let myFactor:Float = 0.4
let filter = CIFilter(name: "CustomFilter")
filter.setValue(inputImage, forKey: kCIInputImageKey)
filter.setValue(myFactor, forKey: "inputBrightnessFactor")
let myOutputImage = filter?.outputImage