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