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
相关产品推荐
相关产品推荐

