Highlight
iPhone 的常规拍照管线追求”美学效果”——环境光的色温、方向、强度都被当作照片氛围的一部分。但有些场景你需要的是”色彩真相”:电商产品照要准确展示商品颜色,伤口追踪要看皮肤颜色的变化。Constant Color API 就是为这些场景设计的。
核心内容
电商卖家拍商品图,买家收到货却说”颜色不对”——这是常见的退货原因。问题不在卖家也不在买家,而在拍照环境:暖光灯、彩色补光灯、甚至窗外射进来的日光,都会让同一件商品在照片里呈现完全不同的颜色。专业做法是用摄影棚和灯光架,但小卖家和独立创作者没有这个条件。
Apple 在 iOS 18 推出的 Constant Color API,把摄影棚级别的色彩一致性塞进了 iPhone。它的原理是利用 iPhone 14 起改进的闪光灯硬件——每台 iPhone 的闪光灯和相机传感器在出厂时都经过精密测量。API 先拍一张闪光灯照片,再拍一张无闪光灯照片,两者快速连拍后做对比:闪光灯带来的亮度增量,就是已知光源与未知环境光之间的差值。通过计算摄影和机器学习,API 推算出”如果只有闪光灯照亮场景会是什么样”,最终渲染成 D65 标准光源下的色彩结果。
Session 展示了大量对比:暖光室内、红绿蓝强光照射、2800K 极暖光等极端条件下,Constant Color 拍出的紫罗兰花盆和皮肤色调几乎一致,而普通模式拍出的照片偏色严重。更关键的是,iPhone 15 上环境光导致的色彩方差降低了 87%。同一个伤口在不同光线下,Constant Color 拍出的淤青范围和颜色变化可以可靠对比,普通模式则完全无法判断。
详细内容
设备支持与管线配置
Constant Color 仅支持照片模式,不支持视频。设备要求 iPhone 14 系列、iPhone 15 系列或 2024 iPad Pro,相机类型必须是 builtInWideAngleCamera 或 builtInDualWideCamera。
检查设备支持:
// 检查当前设备是否支持 Constant Color([10:33](https://developer.apple.com/videos/play/wwdc2024/10162/?time=633))
if photoOutput.isConstantColorSupported {
// 设备支持,可以启用
}
isConstantColorSupported是AVCapturePhotoOutput的属性- 切换相机或格式后该值可能变化
配置管线:
// 在 AVCaptureSession 上启用 Constant Color([11:59](https://developer.apple.com/videos/play/wwdc2024/10162/?time=719))
photoOutput.isConstantColorEnabled = photoOutput.isConstantColorSupported
- 必须将
AVCaptureFlashMode设为.auto或.on,设为.off会抛异常(11:24) - 不支持 RAW 输出,
rawPhotoPixelFormatType必须设为 0(11:39) - 修改
isConstantColorEnabled会触发较长的管线重配置,建议在 App 启动时一次性设置(12:25)
触发拍照与获取结果
每次拍照时,通过 AVCapturePhotoSettings 控制是否请求 Constant Color:
// 逐帧设置是否启用 Constant Color([12:48](https://developer.apple.com/videos/play/wwdc2024/10162/?time=768))
let settings = AVCapturePhotoSettings()
settings.flashMode = flashToggleIsOn ? .on : .auto
settings.isConstantColorEnabled = constantColorToggleIsOn
photoOutput.capturePhoto(with: settings, delegate: self)
isConstantColorEnabled是AVCapturePhotoSettings的属性,默认false- 不设置则走普通美学管线
置信度地图
闪光灯功率有限,远距离或强光环境下可能无法有效照亮场景。API 提供两种方式判断色彩准确性:
// 获取 2D 置信度地图([16:12](https://developer.apple.com/videos/play/wwdc2024/10162/?time=972))
let confidenceMap = photo.constantColorConfidenceMap
// Float 值 0~1,1 = 完全置信,0 = 无置信
// 获取中心加权平均置信度([17:00](https://developer.apple.com/videos/play/wwdc2024/10162/?time=1020))
let meanConfidence = photo.constantColorCenterWeightedMeanConfidenceLevel
- 置信度地图是第二个
CVPixelBuffer输出,每个像素对应照片中一块区域 - 中心加权平均值适合快速判断,建议阈值从 0.8~0.9 开始调(16:39)
- iPad Pro 文档扫描功能使用的阈值为 0.9(22:47)
- 镜面反射区域(如勺子表面的闪光灯反光)会被标记为低置信度,因为像素值已经溢出
回退帧
当置信度不达标时,可以获取一张普通环境光照片作为备选:
// 启用回退帧([17:47](https://developer.apple.com/videos/play/wwdc2024/10162/?time=1067))
settings.isConstantColorFallbackPhotoDeliveryEnabled = true
// 在 delegate 回调中区分([18:09](https://developer.apple.com/videos/play/wwdc2024/10162/?time=1089))
func photoOutput(_ output: AVCapturePhotoOutput,
didFinishProcessingPhoto photo: AVCapturePhoto) {
if photo.isConstantColorFallbackPhoto {
// 这是环境光回退帧
} else {
// 这是 Constant Color 照片
}
}
- 启用后
didFinishProcessingPhoto会被调用两次 - 低置信度区域 Constant Color 图像仍可观看,不会出现奇怪颜色或过度噪声,只是色彩准确性下降
环境光阴影消除
Constant Color 预测的是”暗室中只有闪光灯”的画面,因此环境光投射的阴影会被减弱甚至完全消除。2024 iPad Pro 的文档扫描功能就是基于 Constant Color 实现阴影移除的(22:36)。
验证方法
Apple 在 10 Lux 到 800 Lux 亮度范围、3000K 到 7500K 色温范围下测试,每个亮度色温组合还测试了普朗克白点、品红偏移和绿色偏移。使用 Calibrite ColorChecker 和 Pantone 138 色皮肤色调指南,以及真人拍摄。将 P3 RGB 输出转换到 CIELab* 色彩空间计算跨条件的色彩方差。iPhone 15 上环境光导致的色彩方差降低 87%(21:59)。
核心启发
-
做什么:电商 App 的”商品实拍”流程加入 Constant Color 模式。为什么值得做:买家退货最常见的原因之一是”色差”,Constant Color 消除了拍摄环境造成的色偏,让买家看到的颜色更接近实物。怎么开始:在商品拍照页面增加”色彩还原”开关,对应
settings.isConstantColorEnabled = true,拍完后展示 Constant Color 照片而非普通照片。 -
做什么:健康追踪 App 用 Constant Color 记录皮肤变化。为什么值得做:淤青、皮疹、伤口的颜色变化通常很缓慢,在不同光线条件下肉眼难以判断,Constant Color 让跨时间对比成为可能。怎么开始:在”拍照记录”功能中默认启用 Constant Color,存储时同时保存
constantColorCenterWeightedMeanConfidenceLevel值,低于阈值时提示用户重新拍摄。 -
做什么:文档扫描 App 利用 Constant Color 的阴影消除能力。为什么值得做:桌面文档总有环境光造成的阴影,影响 OCR 和视觉体验,iPad Pro 的文档扫描功能已经用这个方案。怎么开始:启用 Constant Color 后用置信度地图(阈值 0.9)验证扫描区域,阴影区域自然被消除,无需额外的阴影检测算法。
关联 Session
- Build a great Lock Screen camera capture experience — 从锁屏直接启动相机拍摄,扩展相机 App 的使用场景
- What’s new in camera capture & camera bundles — AVFoundation 相机捕获框架年度更新总览
- Deploy machine learning and AI models on-device with Core ML — Constant Color 内部使用了 ML 模型,了解 Core ML 部署优化有助于理解底层
- Explore HDR images and video — Constant Color 输出为 Display P3 色彩空间,HDR 渲染是后续展示环节
评论
GitHub Issues · utterances