美文网首页
OC之AVCapturePhotoBracketSettings

OC之AVCapturePhotoBracketSettings

作者: 苏沫离 | 来源:发表于2018-10-09 10:32 被阅读0次
    照片设置关系图.png

    一、AVCapturePhotoBracketSettings

    AVCapturePhotoBracketSettings 用于拍照请求的功能和设置的规范,用于拍摄具有不同设置的多个图像,继承自AVCapturePhotoSettings

    要进行括号拍摄,可以使用AVCaptureBracketedStillImageSettings对象创建和配置AVCapturePhotoBracketSettings对象,以描述括号中的各个拍摄,然后将其传递给AVCapturePhotoOutput-capturePhotoWithSettings:delegate:方法。

    要请求括号内的拍摄,按照下列步骤操作:

    • 1、创建一个AVCaptureBracketedStillImageSettings对象数组,描述要在括号中拍摄的图像数量以及它们之间拍摄设置的变化。

    • 2、使用-initWithFormat:rawPixelFormatType:bracketedSettings:方法创建一个括号内的照片设置对象,传递包围的静止图像设置数组,以及处理后的格式(如JPEG)或RAW格式来拍摄图像。

    • 3、配置要在括号中的所有图像之间共享的其他设置,例如lensStabilizationEnabled属性和某些继承的属性。
      重要:括号内拍摄仅支持父类AVCapturePhotoSettings定义的highResolutionPhotoEnabledpreviewPhotoFormat设置。括号内拍摄不支持闪光灯,自动稳定或动态照片;尝试设置任何相应的属性会引发异常。

    • 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属性。此外,此数组中的静止图像设置对象的数量不得大于AVCapturePhotoOutputmaxBracketedCapturePhotoCount值。当调用-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像素格式类型。此值必须是AVCapturePhotoOutputavailableRawPhotoPixelFormatTypes数组中列出的格式标识符之一。
    • 参数 rawFileType:最终输出RAW图像的容器文件格式。如果没有首选文件格式,则传递nil,AVCapturePhotoOutput将自动选择适合rawPixelFormatType参数的默认文件格式。
    • 参数 processedFormat:核心视频像素缓冲区属性或AVFoundation视频设置常量字典。
      要以未压缩格式拍摄照片,例如420f,420v或BGRA,在格式字典中设置密钥kCVPixelBufferPixelFormatTypeKey。相应的值必须是AVCapturePhotoOutputavailablePhotoPixelFormatTypes数组中列出的像素格式标识符之一。
      要以压缩格式(如JPEG)拍摄照片,在格式字典中设置密钥AVVideoCodecKey。相应的值必须是AVCapturePhotoOutputavailablePhotoCodecTypes数组中列出的编解码器标识符之一。对于压缩格式,还可以使用密钥AVVideoQualityKey指定压缩级别。
    • 参数 processedFileType:容器文件格式,用于最终输出已处理图像。如果没有首选文件格式,则传递nil,AVCapturePhotoOutput将自动选择适合processedFormat参数的默认文件格式。
    • 参数 bracketedSettingsAVCaptureManualExposureBracketedStillImageSettingsAVCaptureAutoExposureBracketedStillImageSettings对象的数组,每个对象描述用于括号中拍摄中的一个图像的相机设置的变化。此数组中的图像设置对象数必须大于零且小于或等于AVCapturePhotoOutputmaxBracketedCapturePhotoCount值。此数组中的所有图像设置对象必须是同一类型。使用无效数字或图像设置对象组合调用此初始化程序会引发异常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使用光学图像稳定功能在镜头包围拍摄期间保持镜头稳定,有助于对抗手抖并产生更清晰的图像支架。
    仅当AVCapturePhotoOutputlensStabilizationDuringBracketedCaptureSupported属性为YES时,才能启用此设置。
    当调用-capturePhotoWithSettings:delegate:方法时,AVCapturePhotoOutput将验证此要求。如果设置和委托不符合此要求,则该方法会引发异常。

    二、AVCaptureBracketedStillImageSettings

    AVCaptureBracketedStillImageSettings 用于括号内拍照设置的抽象超类,继承自 NSObject

    不得直接实例化AVCaptureBracketedStillImageSettings类。应该根据需要创建AVCaptureManualExposureBracketedStillImageSettingsAVCaptureAutoExposureBracketedStillImageSettings类的实例。

    三、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

    相关文章

      网友评论

          本文标题:OC之AVCapturePhotoBracketSettings

          本文链接:https://www.haomeiwen.com/subject/sekeaftx.html