在OS X 10.14中不推荐使用'init(source :)':不推荐使用Core Image Kernel Language API

时间:2019-05-31 22:34:39

标签: swift deprecated cifilter

我最近升级到Xcode 10.2,我的CIColorKernel代码不再起作用。 CIColorKernel函数返回nil,我得到警告-OS X 10.14中不推荐使用'init(source :)':不推荐使用Core Image Kernel Language API。

Metal Shading Language是CIColorKernel的唯一可用替代品吗?看起来MSL需要为自定义过滤器创建一个单独的文件,我想检查是否有更好的选择。

// Create custom Kernel to replace gray color with black or white.
//Kernel is nil because 'init(source:)' was deprecated in OS X 10.14.

     let Kernel = CIColorKernel( source:
            "kernel vec4 replaceGrayWithBlackOrWhite(__sample grayImage) {" +
                "if (s.r > 0.25 && s.g > 0.25 && s.b > 0.25) {" +
                "    return vec4(0.0,0.0,0.0,1.0);" +
                "} else {" +
                "    return vec4(1.0,1.0,1.0,1.0);" +
                "}" +
            "}"
        )

// Apply the filter
        let blackAndWhiteImage = replaceGrayKernel?.apply(extent: ((grayImage?.extent)! ), arguments: [grayImage as Any])

1 个答案:

答案 0 :(得分:0)

问题不在于贬值,而是在您的内核代码中。

尝试一下:

let testKernel = CIColorKernel(source:
    "kernel vec4 replaceGrayWithBlackOrWhite(__sample grayImage) { " +
        "if (grayImage.r > 0.25 && grayImage.g > 0.25 && grayImage.b > 0.25) { " +
        "    return vec4(0.0,0.0,0.0,1.0);" +
        "} else { " +
        "    return vec4(1.0,1.0,1.0,1.0);" +
        "} " +
    "}"
)

我唯一更改的是(1)我将Kernel重命名为testKernel-没关系-并更改了if语句以检查grayImage而不是{ {1}},这是设置内核签名的方式。重要的是第二个变化。

我创建自定义内核的方法是将代码放入文件中,注册s子类以方便使用,然后执行以下操作:

CIFilter

请注意let kernel = CIColorKernel(source: openKernelFile("myKernel")) override var outputImage: CIImage { return kernel!.apply( extent: inputImage.extent, arguments: [ inputImage as Any, ])! } 的强制展开。这意味着当我测试时,我的应用会立即停止执行,因为kernel!为nil。编码的方式,nil是声明方式的一个不错的选择。

现在,得到警告的原因我不知道吗?我仍然针对iOS 9+。 (我实际上是在测试项目中发现了您的问题,该项目中我正在升级到Metal并定位到iOS 11+。只要您定位到iOS 12+,您就不会收到警告。如果您看看kernel的定义方式,就会发现:

CIColorFilter

我觉得这措辞不好。为什么要沉默“ GL_DEPRICATION”,却声称“ CoreImage内核语言”也是?是的,它是GLSL的“方言”。但还是。

总有一天,您可能需要使用Metal-而不是此周期。

最后一件事-使用Metal的一个主要优点是它将预编译您的内核代码,并且我相信它将在构建中捕获这种错误。