使用CIColor创建CIImage失败,触发EXC_BAD_INSTRUCTION错误求助
解决
CIImage(color:)初始化时的EXC_BAD_INSTRUCTION错误 这个错误大概率是因为Core Image的API需要在有可用图形上下文的环境下运行,尤其是在Playground或者非主线程环境中直接调用时容易触发。下面给你几个可行的解决办法:
方法1:先显式初始化CIContext(推荐)
在创建CIImage之前,先手动初始化CIContext,给Core Image提供可用的渲染上下文,就能避免上下文缺失导致的崩溃:
// 先创建CIContext实例 let context = CIContext() // 再创建纯色CIImage let brownImage = CIImage(color: CIColor(red: 0.6, green: 0.4, blue: 0.2)) // 如果需要转为UIImage使用,可通过CIContext生成CGImage再转换 if let cgImage = context.createCGImage(brownImage, from: brownImage.extent) { let uiImage = UIImage(cgImage: cgImage) // 后续使用uiImage的逻辑 }
方法2:通过UIImage间接创建(快速验证方案)
如果你只是想快速生成纯色CIImage,可以先借助UIKit创建纯色UIImage,再转成CIImage——UIKit会自动帮你处理图形上下文的问题:
// 先创建纯色UIImage(需要先添加UIImage的自定义扩展) let brownUIImage = UIImage(color: UIColor(red: 0.6, green: 0.4, blue: 0.2, alpha: 1.0))! // 转成CIImage let brownImage = CIImage(image: brownUIImage)!
注:上面用到的UIImage(color:)是自定义扩展,没有的话可以先添加这段代码:
extension UIImage { convenience init?(color: UIColor, size: CGSize = CGSize(width: 1, height: 1)) { let rect = CGRect(origin: .zero, size: size) UIGraphicsBeginImageContextWithOptions(rect.size, false, 0.0) color.setFill() UIRectFill(rect) let image = UIGraphicsGetImageFromCurrentImageContext() UIGraphicsEndImageContext() guard let cgImage = image?.cgImage else { return nil } self.init(cgImage: cgImage) } }
方法3:确保在主线程执行
如果这段代码是在后台线程调用的,Core Image的部分初始化操作依赖主线程的图形上下文,把代码放到主线程队列执行试试:
DispatchQueue.main.async { let brownImage = CIImage(color: CIColor(red: 0.6, green: 0.4, blue: 0.2)) // 后续对brownImage的操作 }
补充说明
EXC_BAD_INSTRUCTION在这里的本质是:当你直接调用CIImage(color:)时,Core Image尝试访问当前环境的图形上下文,但如果上下文不存在(比如Playground默认没有初始化图形上下文,或者后台线程没有关联上下文),就会触发指令错误。显式创建CIContext或者通过UIKit层中转,都能帮你规避这个问题。
内容的提问来源于stack exchange,提问作者Ekramul Hoque
相关产品推荐
相关产品推荐

