【问题标题】:'init(source:)' was deprecated in OS X 10.14: Core Image Kernel Language API deprecated'init(source:)' 在 OS X 10.14 中被弃用:Core Image Kernel Language API deprecated
【发布时间】:2019-05-31 22:34:39
【问题描述】:

我最近升级到 Xcode 10.2,我的 CIColorKernel 代码不再工作。 CIColorKernel 函数返回 nil,我收到警告 - 'init(source:)' was deprecated in OS X 10.14: Core Image Kernel Language API deprecated.

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])

【问题讨论】:

  • 有趣。我的内核在 iOS 12 和 iOS 13 beta 中工作。也许是因为我仍然以 iOS 9.0 为基础。针对 iOS 13 的新项目会产生与您相同的错误。如果您的项目不是SwiftUI 项目,那么如果您以 macOS 10.13 为目标会发生什么? (并且作为记录,您可能应该考虑迁移到 Metal,即使针对较低的操作系统版本有效..)
  • 好消息!发现问题。将使用正确的信息编辑我的答案。
  • 另一个不尊重alpha的代码gist.github.com/xhruso00/a3f8a9c8ae7e33b8b23d

标签: swift deprecated cifilter


【解决方案1】:

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

试试这个:

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! 强制解包。这意味着当我测试时,我的应用程序会立即停止执行,因为 kernel 为 nil。你的编码方式,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_DEPRICATION”保持沉默,但声称“CoreImage 内核语言”也是如此?是的,它是 GLSL 的“方言”。但还是。

有一天你可能会需要使用 Metal - 不是这个循环。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-10-28
    • 2017-05-02
    • 1970-01-01
    • 2019-12-17
    • 2022-07-27
    • 2020-12-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多