AVCaptureResolvedPhotoSettings 正在进行或完整的照片拍摄请求所使用的功能和设置的说明,继承自NSObject
。
当调用AVCapturePhotoOutput
实例的- capturePhotoWithSettings:delegate:
方法拍摄照片时,需要在AVCapturePhotoSettings
实例中对该次拍摄做一些设置。
拍摄开始时,AVCapturePhotoOutput
会调用协议方法,并提供AVCaptureResolvedPhotoSettings
对象,详细说明对该次拍摄有效的设置。AVCaptureResolvedPhotoSettings
对象是不可变的,他们描述了一个已经发出的请求。
AVCaptureResolvedPhotoSettings
对象的uniqueID
属性与在请求拍摄时传递的AVCapturePhotoSettings
对象的uniqueID
值相匹配。使用此值可确定哪些协议方法调用对应于哪些拍摄请求。
某些AVCapturePhotoSettings
参数是自动的,例如flashMode
属性。对于此类设置,AVCapturePhotoOutput
确定是否在拍摄时使用该功能。
输出静态照片或者动态照片的尺寸可能直到拍摄时才被设置。例如,当使用previewPhotoFormat
设置指定缩略图大小时,AVCapturePhotoOutput
会选择最符合请求大小的尺寸,同时保留拍摄照片的宽高比。当AVCapturePhotoOutput
调用协议法时,需要使用AVCaptureResolvedPhotoSettings
对象的previewDimensions
属性来查找实际的预览图像尺寸。
1、解决照片拍摄请求
1.1、区分拍摄请求
@property(readonly) int64_t uniqueID;
该uniqueID
与在请求拍摄时传递的AVCapturePhotoSettings
对象的uniqueID
值相匹配。使用此值可确定哪些协议方法调用对应于哪些拍摄请求。
1.2、照片拍摄数量
//照片拍摄数量与这些设置相对应的拍摄请求。
@property(readonly) NSUInteger expectedPhotoCount;
当请求拍摄照片时,AVCapturePhotoOutput
会根据AVCapturePhotoSettings
设置多次调用-captureOutput:didFinishProcessingPhoto:error:
方法。例如,如果要求使用JPEG和RAW格式的图像传送三次曝光的括号,则预期的照片数为6。
AVCapturePhotoOutput
协议方法每个AVCapturePhoto
对象的photoCount
属性指示拍摄结果与此序列的关联位置。当收到的AVCapturePhoto
对象的photoCount
值与此预期照片数相匹配时,这就是针对给定拍摄请求的最后一张照片。
2、检查照片捕获设置
2.1、拍摄该照片是否开启闪光灯
相机闪光灯是否会为此拍摄开启,该值对应于AVCapturePhotoSettings
的属性flashMode
。
@property(readonly, getter=isFlashEnabled) BOOL flashEnabled;
如果在请求拍摄时指定闪光模式为AVCaptureFlashModeAuto
,则设备会在拍摄时自动选择是否根据场景内容使用闪光灯。因此,我们不知道闪光灯是否会在拍摄之前闪光。 当AVCapturePhotoOutput
调用-captureOutput:willBeginCaptureForSettings:
协议方法或拍摄过程中稍后出现的其他协议方法时,我们可以使用此属性来确定拍摄是否使用闪光灯。
如果设备太热,闪光灯也可能暂时禁用。在这种情况下,即使指定了闪光模式为AVCaptureFlashModeOn
,闪光灯也不会闪光,并且传递给AVCapturePhotoCaptureDelegate
方法中的参数AVCaptureResolvedPhotoSettings
的flashEnabled
值为NO。
2.2、是否启动防抖动
该次拍摄是否使用图像稳定,该值对应于AVCapturePhotoSettings
的属性autoStillImageStabilizationEnabled
。
@property(readonly, getter=isStillImageStabilizationEnabled) BOOL stillImageStabilizationEnabled;
当此值为YES时,设备会在弱光条件下自动应用稳定功能以抵消手抖动。自动稳定始终包括数字图像稳定,并且还可以包括基于当前设备的光学镜头稳定。
如果在请求拍摄时指定自动稳定,则设备会根据拍摄时的场景内容自动选择是否使用图像稳定。因此,我们不知道在拍摄之前是否会使用稳定性。当AVCapturePhotoOutput
调用-captureOutput:willBeginCaptureForSettings:
协议方法或拍摄过程中稍后出现的其他协议方法时,可以使用此属性来确定是否启用稳定。
2.3、是否合并双镜头数据
该次拍摄是否合并来自双摄像头的图像数据,该值对应于AVCapturePhotoSettings
属性autoDualCameraFusionEnabled
。
@property(readonly, getter=isDualCameraFusionEnabled) BOOL dualCameraFusionEnabled;
当该值为YES时,双摄像头设备自动组合来自两个摄像头的样本以产生更高质量的图像。仅当在支持的设备上使用AVCaptureDeviceTypeBuiltInDualCamera
类型时,此属性才适用。
如果在请求拍摄时指定自动图像融合,则设备会根据拍摄时的场景条件自动选择是否使用图像融合。 因此,我们不知道图像融合是否会在拍摄之前使用。当AVCapturePhotoOutput
调用-captureOutput:willBeginCaptureForSettings:
协议方法或拍摄过程中稍后出现的其他协议方法时,可以使用此属性来确定图像融合是否处于活动状态。
3、检查输出尺寸
3.1、JPEG格式 与 RAW格式的宽高
拍摄照片的输出尺寸在拍摄时设置,具体取决于设备方向和AVCaptureSession
配置;例如,当AVCaptureSession
包含视频输出并且正在使用视频稳定时,拍摄的照片会更小。
这两个属性要在-captureOutput:didFinishProcessingPhoto:withPreviewPhoto:forSettings:bracketSettings:error:
协议方法中提供传递的图像的尺寸。在早期的协议方法中使用此属性可在传递之前查找图像的大小。
//该次拍摄的JPEG格式的照片的宽高;如果仅拍摄 RAW 格式,则宽高均为0。
@property(readonly) CMVideoDimensions photoDimensions;
//该次拍摄的 RAW 格式照片的宽高;如果拍摄的照片不是 RAW 格式,则宽高均为0。
@property(readonly) CMVideoDimensions rawPhotoDimensions;
3.2、预览图 与 缩略图 的宽高
照片拍摄系统支持预览和缩略图作为拍摄照片中的全尺寸主图像的伴侣。预览图用于立即显示(如在iOS相机应用程序中拍摄时所见),因此可以在当前设备上进行全屏显示。缩略图用于嵌入输出图像文件中,并可由其他软件如文件浏览器中的快速查看,以允许用户快速查看图像而无需加载整个图像文件,缩略图的大小可能会受到限制,具体取决于输出文件格式。
这两个属性提供所请求的预览图或缩略图的尺寸,该尺寸在-captureOutput:didFinishProcessingPhoto:error:
协议方法中提供。在早期的协议方法中使用此属性可在传递之前查找图像的大小。
3.2.1、预览图的宽高
该次拍摄的预览图的宽高(像素);如果未请求预览图像,则宽高均为0。
@property(readonly) CMVideoDimensions previewDimensions;
使用AVCapturePhotoSettings
对象中的previewPhotoFormat
属性,请求在拍摄的主要照片输出旁边传送预览图像。当请求预览时,AVCapturePhotoOutput
会选择最符合我们要求的尺寸,同时保留拍摄照片的宽高比。宽高比由AVCaptureDeviceFormat
和拍摄时的设备方向确定。
3.2.2、缩略图的宽高
该次拍摄的缩略图的宽高;如果不请求缩略图,则宽高均为0。
@property(readonly) CMVideoDimensions embeddedThumbnailDimensions;
使用AVCapturePhotoSettings
对象中的embeddedThumbnailPhotoFormat
属性,请求在拍摄的主要照片输出旁边传送缩略图图像。 当请求缩略图时,AVCapturePhotoOutput
会选择最符合要求的尺寸,同时保留拍摄照片的宽高比。宽高比由AVCaptureDeviceFormat
和拍摄时的设备方向确定。
//该次拍摄的RAW格式嵌入式缩略图的宽高。
@property(readonly) CMVideoDimensions rawEmbeddedThumbnailDimensions;
3.3、动态图片的宽高
该次拍摄的动态照片内容的宽高;如果不请求拍摄动态照片,则宽高均为0。
@property(readonly) CMVideoDimensions livePhotoMovieDimensions;
使用AVCapturePhotoSettings
对象中的livePhotoMovieFileURL
属性来请求拍摄动态照片。动态照片尺寸可能会根据用于拍摄的设备相机而改变。
此属性在-captureOutput:didFinishProcessingLivePhotoToMovieFileAtURL:withDuration:photoDisplayTime:forSettings:error:
协议方法提供动态照片内容的维度。在早期协议方法中使用此属性可在传递之前查找影片的尺寸。
//该次拍摄的肖像效果遮罩的宽高。
@property(readonly) CMVideoDimensions portraitEffectsMatteDimensions;
本文涉及到的更多信息请阅读:
点击阅读 AVCaptureDevice
点击阅读 AVCaptureSession
点击阅读 AVCapturePhotoOutput
点击阅读 AVCapturePhotoSettings
点击阅读 AVCaptureResolvedPhotoSettings
点击阅读 AVCapturePhoto