swift - 'init(源 :)' was deprecated in OS X 10. 14:核心图像内核语言 API 已弃用

标签 swift deprecated cifilter

我最近升级到 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/

相关文章:

ios - 键盘和 UI 元素高度的自动布局问题

swift - 在快速关闭中准确地表示行号?

swift - 无法调用类型 : Swift2 的初始值设定项

swift 2 : How to keep iOS and watchOS2 apps synchronized with WatchConnectivity?

没有序列点的 C++11?

java - java.util.Date 类的参数化构造函数已被弃用。什么是替代方案?

java - 报告 - 使用已弃用的字段、方法和类,即使使用 @SuppressWarnings 进行抑制

ios - 如何使用 CoreImage 滤镜实现灰度滤镜?

swift - 使用 CIFilter 实现移轴图像效果

objective-c - 如何获得有意义的 CIAreaHistogram 输出?