我正在尝试使用CIKernel创建原始CIFilter。
代码在这里。
var kernel: CIKernel?
var inputImage: CIImage?
override init() {
super.init()
self.kernel = createKernel()
}
required init(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)!
self.kernel = createKernel()
}
func outputCustomImage() -> CIImage? {
if let inputImage = self.inputImage {
let dod = inputImage.extent.insetBy(dx: -1, dy: -1)
let args = [inputImage as AnyObject]
let callback: CIKernelROICallback = {
(index, rect) in
return rect.insetBy(dx: -1, dy: -1)
}
return kernel!.applyWithExtent(dod, roiCallback: callback, arguments: args)
}
return nil
}
private func createKernel() -> CIKernel {
let kernelString =
"kernel vec4 RGB_to_GBR(sampler source_image)\n" +
"{\n" +
"vec4 originalColor, twistedColor;\n" +
"originalColor = sample(source_image, samplerCoord(source_image));\n" +
"twistedColor.r = originalColor.g;\n" +
"twistedColor.g = originalColor.b;\n" +
"twistedColor.b = originalColor.r ;\n" +
"twistedColor.a = originalColor.a;\n" +
"return twistedColor;\n" +
"}\n"
return CIKernel(string: kernelString)!
}
和警告信息
注意:CIColorKernel applyWithExtent:roiCallback:arguments:忽略回调而不推荐。使用applyWithExtent:arguments:而不是。
答案 0 :(得分:2)
我想您提供的源代码可能与生成警告的代码不同。对于您正在撰写的过滤器,只需要CIColorKernel
,如果您正在提供ROI回调,就会生成该警告。
如果您需要访问其他像素,则通用内核(CIKernel
)非常有用 - 例如,如果您正在编写模糊过滤器。由于您只对当前像素感兴趣,请坚持使用颜色内核并使用apply(withExtent:arguments:)
。
通常,如果您是CIFilter
的子类,则覆盖outputImage
。看看这个版本(我还简化了你的内核代码):
class RGB_to_GBR: CIFilter {
let kernel: CIColorKernel = {
let kernelString =
"kernel vec4 RGB_to_GBR(__sample pixel)\n" +
"{\n" +
"vec4 twistedColor = pixel.gbra;\n" +
"return twistedColor;\n" +
"}\n"
return CIColorKernel(string: kernelString)!
}()
var inputImage: CIImage?
override var outputImage: CIImage? {
guard let inputImage = inputImage else {
return nil
}
return kernel.apply(withExtent: inputImage.extent,
arguments: [inputImage])
}
}