关于AVCaptureSession.Preset选型与照片宽高比调整的疑问
1. 拍摄静态照片是否只能选择
.photo预设 不是,其余视频类预设也可以输出静态照片,但二者的输出逻辑和质量有明显差异:
- 用
.photo预设时,系统会调用摄像头的原生拍照能力,输出设备支持的最高分辨率静态图片,同时支持RAW、ProRAW、夜间模式、HDR等照片专属特性,是高画质拍照场景的最优选择。 - 用
.low/.hd1920x1080等视频类预设时,静态照片是从实时视频流中截取的单帧,分辨率等于当前视频的分辨率,无法触发照片专属的画质优化,仅适合扫码、低清快照等轻量场景。
2.
.low/.medium/.high与固定分辨率预设的差异 二者的核心区别是分辨率适配逻辑不同:
- 动态档位预设(
.low/.medium/.high):不会固定输出分辨率,会根据当前设备的硬件能力自动匹配对应档位的最高可用规格。比如同是.high预设,老款iPhone可能对应720P 30帧,新款iPhone可能默认匹配4K 30帧,优势是兼容性极强,不需要额外做设备适配。 - 固定分辨率预设(
.hd1920x1080/.hd4K3840x2160等):会强制会话输出指定的分辨率和帧率,如果当前设备不支持该规格,会话配置会直接失败,优势是可以精确控制输出参数,适合有明确画质要求的场景。
3. 调整静态照片宽高比的实现方案
常见有两种实现路径,可根据需求选择:
- 原生输出对应比例:首先通过
AVCapturePhotoOutput的supportedPhotoDimensions(for:)方法查询当前设备支持的所有原生照片尺寸,从中筛选出4:3、16:9等目标比例的尺寸,初始化AVCapturePhotoSettings时指定该尺寸即可,这种方式无画质损失,但依赖设备硬件支持,部分老旧设备可能没有16:9的原生照片规格。 - 采集后裁剪:先采集完整分辨率的原始照片,再对
UIImage/CIImage对象按照目标比例做裁剪处理,这种方式灵活性最高,支持任意比例输出,适合需要同时生成多规格照片的场景。
如果需要预览层和输出照片比例保持一致,同步修改AVCaptureVideoPreviewLayer的videoGravity属性即可,.resizeAspectFill对应等比例铺满、.resizeAspect对应完整显示比例内容。
内容的提问来源于stack exchange,提问作者mmoore410
相关产品推荐
相关产品推荐

