Implement high resolution photo capture
Graphics, Games & Media 进阶 17m

实现高分辨率照片拍摄

Implement high resolution photo capture

2026年6月10日

在 Apple 官方观看视频

一句话判断

这场 Session 最值得关注的一件事是:Apple 终于把原生相机 App 里“连拍不卡顿”的秘密武器——延迟照片处理 (Deferred photo processing) 和快速拍摄优先 (Fast capture prioritization) 彻底向第三方开放了。

这场 Session 讲了什么

以前第三方相机 App 拍 4800 万像素照片,拍完一张快门按钮就得转圈圈等好几秒,用户体验极其割裂。现在 Apple 把 24MP 和 48MP 的高分辨率拍摄管线全面梳理了一遍,不仅教你怎么通过 maxPhotoDimensions 拿到最高画质,更关键的是给了一套解决“高画质与连拍速度矛盾”的完整方案。

通过引入响应式快门和后台延迟处理,你的 App 可以在用户狂按快门时先给个轻量级的代理照片 (Proxy photo),把重活累活扔到后台或者设备空闲时再做。这对所有做相机、扫描、文档类 App 的开发者来说是个巨大的体验升级,终于不用在“画质”和“响应速度”之间做痛苦的单选题了。

值得深挖的点

快速拍摄优先 (Fast capture prioritization) 的动态降级策略

Apple 在这里做了一个非常聪明的 trade-off。当用户开启 fastCapturePrioritization 并连续快速点击快门时,系统不会死板地坚持 .quality 优先级导致管线阻塞,而是会动态把照片质量降级到 .balanced

这背后的逻辑是:用户在连拍时,更在意的是“有没有拍到”而不是“这一张是不是绝对完美”。从 iOS 27 开始,系统甚至会在降级到 .balanced 后,继续利用延迟处理在后台慢慢打磨这张照片。这种“先保证抓到画面,再偷偷优化画质”的策略,完美复刻了原生相机 App 的丝滑体验。第三方开发者以前只能自己写复杂的队列和状态机来模拟这种行为,现在直接一个布尔值搞定。坑点在于,你必须接受系统帮你做的画质降级决定,如果你的 App 场景是严格的工业检测,必须张张最高画质,那就别开这个属性。

24MP/48MP 资源预分配的“隐形账单”

高分辨率照片的管线初始化非常重。Session 里反复强调要用 setPreparedPhotoSettingsArray 来预分配资源。如果你只是在用户按下快门时才去设置 maxPhotoDimensionsphotoQualityPrioritization,第一张照片的拍摄延迟会高得离谱。

这里有个容易踩的坑:24MP 是计算摄影多帧融合的结果,它强制要求 photoQualityPrioritization 设置为 .quality。如果你设成了 .balanced.speed,系统会默默回退到 12MP。很多开发者在测试时发现“明明设了 24MP 怎么拍出来还是 12MP”,多半是因为质量优先级没对齐。另外,预分配 settings 和实际 capture settings 必须是两个独立的对象,只是属性值要完全一样,千万别把 prepare 的对象直接拿去 capture。

代码片段

1. 预分配高分辨率管线资源

场景:在用户进入 48MP 拍摄模式时,提前预热管线,避免按下快门时的卡顿。

let prepareSettings = AVCapturePhotoSettings()
// 设置最大分辨率和质量优先级
prepareSettings.maxPhotoDimensions = photoOutput.maxPhotoDimensions
prepareSettings.photoQualityPrioritization = .quality

// 预热管线,分配底层硬件资源
photoOutput.setPreparedPhotoSettingsArray([prepareSettings]) { prepared, error in
    if let error = error {
        print("管线预热失败: \(error)")
        return
    }
    print("管线预热成功,可以开始拍摄了")
}

坑:预热用的 prepareSettings 对象不能直接用于后续的 capturePhoto 方法,必须新建一个配置相同的 captureSettings 对象。

2. 开启延迟处理与快速拍摄优先

场景:让快门按钮在连拍时保持响应,并把耗时的多帧融合处理扔到后台。

// 开启响应式快门,允许上一张还在处理时拍下一张
photoOutput.isResponsiveCaptureEnabled = true

// 开启延迟处理,先返回轻量级代理照片,后台再处理最终照片
photoOutput.isDeferredPhotoDeliveryEnabled = true

// 开启快速拍摄优先,连拍时系统会自动降级质量以保证速度
if #available(iOS 27.0, *) {
    photoOutput.fastCapturePrioritizationEnabled = true
}

坑:开启延迟处理后,你需要实现 didFinishCapturingDeferredPhotoProxy 代理方法来接收代理照片,并通过 PhotoKit 去请求最终的高清照片,别傻等 didFinishProcessingPhoto

最佳实践

对于已有项目,如果你现在的相机模块还在用 AVCaptureSession.Preset.photo 搭配默认设置,建议立刻把 maxPhotoQualityPrioritization 设为 .quality,并引入 setPreparedPhotoSettingsArray。这不需要大改架构,就能显著降低首张照片的拍摄延迟。

对于新项目,强烈建议直接拥抱延迟照片处理 (Deferred photo processing)。把 UI 逻辑改成“先显示代理照片缩略图,后台处理完再无缝替换为高清大图”。这会让你的 App 在 48MP 模式下的体验直接对齐系统原生相机。

实战中最容易踩的坑是内存峰值。48MP 的多帧融合非常吃内存,如果你同时开启了连拍和延迟处理,一定要在 AVCapturePhotoCaptureDelegate 里及时释放不需要的中间帧数据,否则在低端机型上极易触发 OOM (Out of Memory) 崩溃。

还有什么值得关注

  • 24MP 支持范围扩大:除了主摄,iPhone 16 Pro 的长焦镜头和 iPhone 17 的超广角镜头现在也支持 24MP/48MP 拍摄了。
  • Center Stage 前置相机支持 18MP:iPhone 17 的前置镜头在开启人物居中 (Center Stage) 时,也能输出 18MP 的高分辨率照片,但同样强制要求 .quality 优先级。
  • captureReadiness 属性:现在可以通过监听 AVCapturePhotoOutputcaptureReadiness 属性,精确知道下一张照片何时可以拍摄,用来做 UI 上的快门按钮置灰或高亮逻辑非常方便。
AVFoundation Camera HighResolution DeferredProcessing