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

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")
}

其他需要注意的细节坑

  1. inputCount与inputMeans长度必须严格匹配:你这里设置inputCount=2,数组长度也是2,这点是对的,但如果两者数量不一致,必然会触发崩溃,要始终保持两者数量统一。
  2. 用图像作为inputMeans的要求:如果想用图像替代颜色数组,那图像的像素数量必须等于inputCount。比如inputCount=2,你需要创建一个1x2的单通道/3通道图像,每个像素对应一个初始均值颜色。
  3. 颜色空间兼容性:当inputPerceptual设为true时,要确保输入图像的颜色空间支持感知计算(比如sRGB),否则可能会出现隐性异常。
  4. 先验证基础功能:如果还是有问题,可以先去掉inputMeans参数,让滤镜自动计算初始均值,确认滤镜本身能正常工作后,再逐步添加参数排查问题。

亲测这样修改后,CIKMeans就能正常生成输出图像了,你可以试试看!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 18:02:28