Xcode中CoreImage报错:找不到kCIImageAccurateMetadata与CIDetectorTypeColor
CoreImage中
kCIImageAccurateMetadata和CIDetectorTypeColor找不到的解决方法 已正确关联CoreImage框架,尝试提取图片强调色作为背景时出现两个编译错误:
Cannot find 'kCIImageAccurateMetadata' in scopeCannot find 'CIDetectorTypeColor' in scope
清理Xcode缓存后问题仍存在,相关代码如下:
import SwiftUI import UIKit import CoreImage class ColorExtractor { var dominantColor: UIColor? func extractColors(from image: UIImage, completion: @escaping ([UIColor]) -> Void) { guard let ciImage = CIImage(image: image) else { completion([]) return } DispatchQueue.global(qos: .userInteractive).async { let accuracy = [kCIImageAccurateMetadata: true] let colorDetector = CIDetector(ofType: CIDetectorTypeColor, context: nil, options: accuracy)! let features = colorDetector.features(in: ciImage) let colors = features.compactMap { feature -> UIColor? in guard let color = feature.color else { return nil } return UIColor(ciColor: color) } self.dominantColor = colors.first DispatchQueue.main.async { completion(colors) } } } }
问题原因
CIDetectorTypeColor并非CoreImage官方支持的检测器类型,CIDetector仅支持人脸、二维码、文本、矩形等检测场景,从未提供颜色检测的类型,你可能混淆了其他框架的API。kCIImageAccurateMetadata是已废弃/移除的旧API键,当前CoreImage中检测器的精度选项使用CIDetectorAccuracy键,对应值为CIDetectorAccuracyHigh或CIDetectorAccuracyLow。
正确的图片主色调提取实现
如果需要提取图片的主色调,可以使用CoreImage的CIAreaAverage滤镜来实现,这是官方推荐的方式:
import SwiftUI import UIKit import CoreImage class ColorExtractor { var dominantColor: UIColor? func extractColors(from image: UIImage, completion: @escaping ([UIColor]) -> Void) { guard let ciImage = CIImage(image: image) else { completion([]) return } DispatchQueue.global(qos: .userInteractive).async { // 使用CIAreaAverage滤镜提取主色调 let filter = CIFilter(name: "CIAreaAverage")! filter.setValue(ciImage, forKey: kCIInputImageKey) // 设置取样区域为整个图片 let extent = ciImage.extent filter.setValue(CIVector(x: extent.origin.x, y: extent.origin.y, z: extent.size.width, w: extent.size.height), forKey: kCIInputExtentKey) guard let outputImage = filter.outputImage else { DispatchQueue.main.async { completion([]) } return } // 从输出图片中获取颜色值 var bitmap = [UInt8](repeating: 0, count: 4) let context = CIContext(options: [.workingColorSpace: kCFNull!]) context.render(outputImage, toBitmap: &bitmap, rowBytes: 4, bounds: CGRect(x: 0, y: 0, width: 1, height: 1), format: .RGBA8, colorSpace: nil) let color = UIColor(red: CGFloat(bitmap[0])/255, green: CGFloat(bitmap[1])/255, blue: CGFloat(bitmap[2])/255, alpha: CGFloat(bitmap[3])/255) self.dominantColor = color DispatchQueue.main.async { completion([color]) } } } }
说明
CIAreaAverage滤镜会计算指定区域内的平均颜色,这里设置为整个图片,得到的就是图片的主色调。- 通过CIContext将滤镜输出的1x1图片渲染到字节数组中,再转换为UIColor。
内容的提问来源于stack exchange,提问作者AYohannes
相关产品推荐
相关产品推荐

