You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

iOS中CIColorKernel的init(source:)弃用警告问题求助

解决CIColorKernel init(source:) 弃用警告的替代方案

你遇到的'init(source:)' was deprecated in iOS 12.0警告,是因为Core Image Kernel Language API已被弃用,不用屏蔽警告的话,可以改用Metal Shader Kernel来实现相同的色度抠图逻辑,具体步骤如下:

1. 创建Metal Shader文件

新建一个Metal文件(比如命名为ChromaKeyKernel.metal),写入以下代码:

#include <CoreImage/CoreImage.h>

using namespace metal;

extern "C" {
    namespace coreimage {
        float4 chromaKey(sample_t s, float4 c, float threshold) {
            float4 diff = s.rgba - c;
            float distance = length(diff);
            float alpha = step(threshold, distance);
            return float4(s.rgb, alpha);
        }
    }
}

注:这里用step函数替代了原Core Image Kernel里的compare,功能完全一致——当distance - threshold >= 0时返回1.0,否则返回0.0。

2. 修改Swift代码加载Metal Kernel

替换原来的createCustomKernel()方法,改为加载Metal Shader:

func createCustomKernel() -> CIColorKernel {
    guard let url = Bundle.main.url(forResource: "ChromaKeyKernel", withExtension: "metal"),
          let source = try? String(contentsOf: url) else {
        fatalError("无法加载Metal Shader文件")
    }
    guard let kernel = try? CIColorKernel(functionName: "chromaKey", fromMetalLibraryData: source.data(using: .utf8)!) else {
        fatalError("无法创建CIColorKernel")
    }
    return kernel
}

3. 使用方式不变

原来调用这个kernel的逻辑不需要改动,比如:

let kernel = createCustomKernel()
let outputImage = kernel.apply(extent: inputImage.extent, roiCallback: { _, rect in rect }, arguments: [inputImage, CIColor.green, 0.5])

这样既解决了弃用警告,又延续了原有的色度抠图功能,而且Metal Shader的性能相比旧API更优。

内容的提问来源于stack exchange,提问作者Hope

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 13:42:17