iOS 13.0 CIKMeans CIFilter获取outputImage时抛出异常求助
解决CIKMeans滤镜设置inputMeans崩溃的问题
我之前在使用CIKMeans的时候也踩过这个一模一样的坑,折腾了好一阵才找到问题所在!你的代码核心问题出在inputMeans参数的类型上——虽然文档说可以传颜色数组,但它要求的不是CIColor数组,而是**CGColor数组**。
修正后的可运行代码示例
把你设置inputMeans的那行代码替换成下面这样试试:
guard let kMeansFilter = CIFilter(name: "CIKMeans") else { fatalError("Could not initialize `CIKMeans` filter.") } kMeansFilter.setValue(ciImage, forKey: kCIInputImageKey) kMeansFilter.setValue(CIVector(cgRect: ciImage.extent), forKey: "inputExtent") kMeansFilter.setValue(2, forKey: "inputCount") kMeansFilter.setValue(10, forKey: "inputPasses") kMeansFilter.setValue(NSNumber(value: true), forKey: "inputPerceptual") // 替换为CGColor数组,这是关键修正点 kMeansFilter.setValue([UIColor(red: 1, green: 0, blue: 1).cgColor, UIColor(red: 0, green: 1, blue: 1).cgColor], forKey: "inputMeans") if let outputImage = kMeansFilter.outputImage { // 在这里处理生成的输出图像 } else { print("Failed to generate output image from CIKMeans") }
其他需要注意的细节坑
- inputCount与inputMeans长度必须严格匹配:你这里设置
inputCount=2,数组长度也是2,这点是对的,但如果两者数量不一致,必然会触发崩溃,要始终保持两者数量统一。 - 用图像作为inputMeans的要求:如果想用图像替代颜色数组,那图像的像素数量必须等于
inputCount。比如inputCount=2,你需要创建一个1x2的单通道/3通道图像,每个像素对应一个初始均值颜色。 - 颜色空间兼容性:当
inputPerceptual设为true时,要确保输入图像的颜色空间支持感知计算(比如sRGB),否则可能会出现隐性异常。 - 先验证基础功能:如果还是有问题,可以先去掉
inputMeans参数,让滤镜自动计算初始均值,确认滤镜本身能正常工作后,再逐步添加参数排查问题。
亲测这样修改后,CIKMeans就能正常生成输出图像了,你可以试试看!
内容的提问来源于stack exchange,提问作者BorisE
相关产品推荐
相关产品推荐

