我最近升级到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])
答案 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的一个主要优点是它将预编译您的内核代码,并且我相信它将在构建中捕获这种错误。