iOS:CIColorKernel applyWithExtent警告消息

时间:2016-09-25 08:24:14

标签: ios swift cifilter

我正在尝试使用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:而不是。

1 个答案:

答案 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])
    }
}