WWDC Quick Look 💓 By SwiftGGTeam
Keep colors consistent across captures

Keep colors consistent across captures

观看原视频

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,相机类型必须是 builtInWideAngleCamerabuiltInDualWideCamera

检查设备支持:

// 检查当前设备是否支持 Constant Color([10:33](https://developer.apple.com/videos/play/wwdc2024/10162/?time=633))
if photoOutput.isConstantColorSupported {
    // 设备支持,可以启用
}
  • isConstantColorSupportedAVCapturePhotoOutput 的属性
  • 切换相机或格式后该值可能变化

配置管线:

// 在 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)
  • isConstantColorEnabledAVCapturePhotoSettings 的属性,默认 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

评论

GitHub Issues · utterances