我最近升级到 Xcode 10.2,我的 CIColorKernel 代码不再工作。 CIColorKernel 函数返回 nil,我收到警告 - 'init(source:)' 在 OS X 10.14 中已弃用:核心图像内核语言 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])
最佳答案
问题不在于贬值,而在于您的内核代码。
试试这个:
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
而不是 s
,这就是设置内核签名的方式。重要的是第二个变化。
我创建自定义内核的方法是将代码放入文件中,注册 CIFilter
子类以便于使用,然后执行以下命令:
let kernel = CIColorKernel(source: openKernelFile("myKernel"))
override var outputImage: CIImage {
return kernel!.apply(
extent: inputImage.extent,
arguments: [
inputImage as Any,
])!
}
注意内核!
强制解包。这意味着当我测试时,我的应用程序立即停止执行,因为 kernel
为零。根据您的编码方式,nil 在您声明它的方式中是一个不错的值。
现在,您收到警告而我没有收到的原因是什么?我的目标仍然是 iOS 9+。 (实际上,我在一个测试项目中发现了您的问题,我正在升级到 Metal 并针对 iOS 11+。只要您不针对 iOS 12+,您就不会收到警告。如果你看看CIColorFilter
是如何定义的,你会发现:
@available(iOS, introduced: 8.0, deprecated: 12.0, message: "Core Image Kernel Language API deprecated. (Define CI_SILENCE_GL_DEPRECATION to silence these warnings)")
我觉得这个措辞很糟糕。为什么你应该沉默“GL_DEPICATION”但声称“CoreImage Kernel Language”也是如此?是的,它是 GLSL 的一种“方言”。但仍然如此。
有一天,您可能需要使用 Metal - 但不是这个周期。
最后一件事 - 使用 Metal 的一个主要优点是它会预编译你的内核代码,我相信它会在构建中捕获这种错误。
关于swift - 'init(源 :)' was deprecated in OS X 10. 14:核心图像内核语言 API 已弃用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56402391/