一、AVCapturePhotoBracketSettings
AVCapturePhotoBracketSettings 用于拍照请求的功能和设置的规范,用于拍摄具有不同设置的多个图像,继承自AVCapturePhotoSettings
。
要进行括号拍摄,可以使用AVCaptureBracketedStillImageSettings
对象创建和配置AVCapturePhotoBracketSettings
对象,以描述括号中的各个拍摄,然后将其传递给AVCapturePhotoOutput
的-capturePhotoWithSettings:delegate:
方法。
要请求括号内的拍摄,按照下列步骤操作:
-
1、创建一个
AVCaptureBracketedStillImageSettings
对象数组,描述要在括号中拍摄的图像数量以及它们之间拍摄设置的变化。 -
2、使用
-initWithFormat:rawPixelFormatType:bracketedSettings:
方法创建一个括号内的照片设置对象,传递包围的静止图像设置数组,以及处理后的格式(如JPEG)或RAW格式来拍摄图像。 -
3、配置要在括号中的所有图像之间共享的其他设置,例如
lensStabilizationEnabled
属性和某些继承的属性。
重要:括号内拍摄仅支持父类AVCapturePhotoSettings
定义的highResolutionPhotoEnabled
和previewPhotoFormat
设置。括号内拍摄不支持闪光灯,自动稳定或动态照片;尝试设置任何相应的属性会引发异常。 -
4、将带括号的照片设置对象传递到
AVCapturePhotoOutput
的-capturePhotoWithSettings:delegate:
方法,启动拍摄,接收有关拍摄进度和结果的消息。
提示:拍摄多图像括号可能需要分配额外的资源。请参阅-setPreparedPhotoSettingsArray:completionHandler:
方法。 -
5、
AVCapturePhotoOutput
调用委托方法-captureOutput:didFinishProcessingPhotoSampleBuffer:previewPhotoSampleBuffer:resolvedSettings:bracketSettings:error:
或-captureOutput:didFinishProcessingRawPhotoSampleBuffer:previewPhotoSampleBuffer:resolvedSettings:bracketSettings:error:
方法多次对应于括号中的拍摄数量。每个调用都提供AVCaptureBracketedStillImageSettings
对象,指示拍摄的图像对应于括号中的哪个拍摄。
1、创建AVCapturePhotoBracketSettings
请求其中一种或两种格式都会增加其他照片设置的要求:请参阅处理格式要求的format
属性和RAW格式要求的rawPhotoPixelFormatType
属性。此外,此数组中的静止图像设置对象的数量不得大于AVCapturePhotoOutput
的maxBracketedCapturePhotoCount
值。当调用-capturePhotoWithSettings:delegate:
方法时,AVCapturePhotoOutput
将验证这些要求;如果设置和委托不符合这些要求,则该方法会引发异常。
1.1、创建照片设置对象,以RAW格式和处理格式(如JPEG)拍照。
+ (instancetype)photoBracketSettingsWithRawPixelFormatType:(OSType)rawPixelFormatType
rawFileType:(AVFileType)rawFileType
processedFormat:(NSDictionary<NSString *,id> *)processedFormat
processedFileType:(AVFileType)processedFileType
bracketedSettings:(NSArray<AVCaptureBracketedStillImageSettings *> *)bracketedSettings;
该方法有五个参数:
- 参数
rawPixelFormatType
:用于拍摄的Bayer RAW像素格式类型。此值必须是AVCapturePhotoOutput
的availableRawPhotoPixelFormatTypes
数组中列出的格式标识符之一。 - 参数
rawFileType
:最终输出RAW图像的容器文件格式。如果没有首选文件格式,则传递nil,AVCapturePhotoOutput
将自动选择适合rawPixelFormatType
参数的默认文件格式。 - 参数
processedFormat
:核心视频像素缓冲区属性或AVFoundation
视频设置常量字典。
要以未压缩格式拍摄照片,例如420f,420v或BGRA,在格式字典中设置密钥kCVPixelBufferPixelFormatTypeKey
。相应的值必须是AVCapturePhotoOutput
的availablePhotoPixelFormatTypes
数组中列出的像素格式标识符之一。
要以压缩格式(如JPEG)拍摄照片,在格式字典中设置密钥AVVideoCodecKey
。相应的值必须是AVCapturePhotoOutput
的availablePhotoCodecTypes
数组中列出的编解码器标识符之一。对于压缩格式,还可以使用密钥AVVideoQualityKey
指定压缩级别。 - 参数
processedFileType
:容器文件格式,用于最终输出已处理图像。如果没有首选文件格式,则传递nil,AVCapturePhotoOutput
将自动选择适合processedFormat
参数的默认文件格式。 - 参数
bracketedSettings
:AVCaptureManualExposureBracketedStillImageSettings
或AVCaptureAutoExposureBracketedStillImageSettings
对象的数组,每个对象描述用于括号中拍摄中的一个图像的相机设置的变化。此数组中的图像设置对象数必须大于零且小于或等于AVCapturePhotoOutput
的maxBracketedCapturePhotoCount
值。此数组中的所有图像设置对象必须是同一类型。使用无效数字或图像设置对象组合调用此初始化程序会引发异常NSInvalidArgumentException
。
1.2、以指定格式为指定的捕获括号创建照片设置对象。
+ (instancetype)photoBracketSettingsWithRawPixelFormatType:(OSType)rawPixelFormatType
processedFormat:(NSDictionary<NSString *,id> *)processedFormat
bracketedSettings:(NSArray<__kindof AVCaptureBracketedStillImageSettings *> *)bracketedSettings;
该方法有三个参数,具体作用如上个方法类似。
要请求包围拍照,创建一个AVCaptureBracketedStillImageSettings
对象数组,每个对象描述捕获设置中的变化以用于括号中的一次曝光,并将该数组传递给bracketedSettings
参数。该阵列中括号内设置对象的数量决定了捕获括号中的曝光次数。
要仅以RAW格式拍照,processedFormat
参数传递nil。要仅以处理的格式拍照,awPixelFormatType
参数传递nil。为processedFormat
参数传递nil和为rawPixelFormatType
参数传递nil等效于请求仅JPEG传递。
2、使用设置
2.1、描述在括号中拍照时生成的图像的数量和设置。
@property(nonatomic, readonly)
NSArray<__kindof AVCaptureBracketedStillImageSettings *> *bracketedSettings;
此数组是只读的,在使用 -initWithFormat:rawPixelFormatType:bracketedSettings:
创建设置对象时,提供此括号设置数组。
2.2、是否在括号内拍照期间稳定镜头
//默认设置为NO
@property(nonatomic, getter=isLensStabilizationEnabled)
BOOL lensStabilizationEnabled;
当为YES时,AVCapturePhotoOutput
使用光学图像稳定功能在镜头包围拍摄期间保持镜头稳定,有助于对抗手抖并产生更清晰的图像支架。
仅当AVCapturePhotoOutput
的lensStabilizationDuringBracketedCaptureSupported
属性为YES时,才能启用此设置。
当调用-capturePhotoWithSettings:delegate:
方法时,AVCapturePhotoOutput
将验证此要求。如果设置和委托不符合此要求,则该方法会引发异常。
二、AVCaptureBracketedStillImageSettings
AVCaptureBracketedStillImageSettings 用于括号内拍照设置的抽象超类,继承自 NSObject
。
不得直接实例化AVCaptureBracketedStillImageSettings
类。应该根据需要创建AVCaptureManualExposureBracketedStillImageSettings
和AVCaptureAutoExposureBracketedStillImageSettings
类的实例。
三、AVCaptureAutoExposureBracketedStillImageSettings
AVCaptureAutoExposureBracketedStillImageSettings 用于根据相对于自动曝光的偏差来定义包围的照片捕获的配置,继承自 AVCaptureBracketedStillImageSettings
。
AVCaptureAutoExposureBracketedStillImageSettings
实例应用于括号中的一个图像的曝光目标偏差设置。将该对象数组传递给-captureStillImageBracketAsynchronouslyFromConnection:withSettingsArray:completionHandler:
指定包围。
最小和最大曝光目标偏差是AVCaptureDevice
实例向AVCaptureStillImageOutput
实例提供数据的属性。如果为此括号静止图像保留exposureTargetBias
,则可以传递值AVCaptureExposureTargetBiasCurrent
。
1、创建自动曝光设置实例
使用指定的曝光目标偏差创建AVCaptureAutoExposureBracketedStillImageSettings
。
+ (instancetype)autoExposureSettingsWithExposureTargetBias:(float)exposureTargetBias;
- 参数
exposureTargetBias
:曝光目标偏差。传递AVCaptureExposureTargetBiasCurrent
以使此图像保持不变的exposureTargetBias
。
2、获得曝光目标偏差
//自动曝光括号设置的曝光偏差
@property(readonly) float exposureTargetBias;
3、使用示例
下述代码说明了使用不同的曝光值设置拍摄三个RAW图像的括号:
- (void)captureRAWAutoExposureBracket {
if ( myCapturePhotoOutput.maxBracketedCapturePhotoCount < 3 ) { return; }
// 指定一个3次闪光,每个闪光的曝光补偿不同。
NSArray *bracketedStillImageSettings = @[ [AVCaptureAutoExposureBracketedStillImageSettings autoExposureSettingsWithExposureTargetBias:-2.],
[AVCaptureAutoExposureBracketedStillImageSettings autoExposureSettingsWithExposureTargetBias:0.],
[AVCaptureAutoExposureBracketedStillImageSettings autoExposureSettingsWithExposureTargetBias:2.] ];
OSType rawFormat = [[myCapturePhotoOutput.availableRawPhotoCVPixelFormatTypes firstObject] intValue];
AVCapturePhotoBracketSettings *settings = [[AVCapturePhotoBracketSettings alloc] initWithFormat:nil rawPixelFormatType:rawFormat bracketedSettings:bracketedStillImageSettings];
settings.lensStabilizationEnabled = myCapturePhotoOutput.isLensStabilizationDuringBracketedCaptureSupported;
[myCapturePhotoOutput capturePhotoWithSettings:settings delegate:self];
// 三张原始照片将发送给委托。
}
四、AVCaptureAutoExposureBracketedStillImageSettings
AVCaptureManualExposureBracketedStillImageSettings 用于根据特定曝光和ISO值定义括号内照片捕获的配置,继承自 AVCaptureBracketedStillImageSettings
。
该类是包围曝光持续时间和ISO时使用的AVCaptureBracketedStillImageSettings
类的具体子类。
该类实例定义应该应用于括号中的一个图像的曝光持续时间和ISO设置。将该类对象数组传递给-captureStillImageBracketAsynchronouslyFromConnection:withSettingsArray:completionHandler:
指定包围。
最小和最大持续时间和ISO是向AVCaptureStillImageOutput
实例提供数据的AVCaptureDevice
实例的可查询属性。如果为此括号静止图像保持exposureDuration
不变,则在创建实例时传递值AVCaptureExposureDurationCurrent
。要保持ISO不变,在创建实例时传递AVCaptureISOCurrent
。
1、创建手动包围曝光设置实例
使用指定的曝光持续时间和ISO创建AVCaptureManualExposureBracketedStillImageSettings
。
+ (instancetype)manualExposureSettingsWithExposureDuration:(CMTime)duration ISO:(float)ISO;
- 参数
duration
:曝光持续时间:秒。传递AVCaptureExposureDurationCurrent
以保持此括号图像的持续时间不变。 - 参数 ISO :传递
AVCaptureISOCurrent
以使此括号图像保持ISO不变。
2、获取手动曝光设置值
//静止图像的ISO。
@property(readonly) float ISO;
//静止图像的曝光持续时间。
@property(readonly) CMTime exposureDuration;
本文涉及到的更多信息请阅读:
点击阅读 AVCaptureDevice
点击阅读 AVCaptureSession
点击阅读 AVCapturePhotoOutput
点击阅读 AVCapturePhotoCaptureDelegate
点击阅读 AVCapturePhotoSettings
点击阅读 AVCapturePhotoBracketSettings
点击阅读 AVCaptureResolvedPhotoSettings
点击阅读 AVCapturePhoto
网友评论