在Apple的iOS 6.0 feature page上,它曾经说过
利用内置相机的高级功能。新的API可让您控制焦点,曝光和感兴趣的区域。您还可以使用面部检测API访问和显示面部,并利用支持硬件的视频稳定功能。
此文本已被删除,我无法在API中找到用于控制曝光的新方法。在“曝光设置”下的课程AVCaptureDevice
中,没有针对iOS 6.0的新属性/方法。您知道在哪里可以找到API中的曝光新功能吗?
答案 0 :(得分:23)
-exposureMode
上有一个AVCaptureDevice
属性,但这仅适用于设置模式(关/自动/连续)而非实际f-停止,SS或ISO。提供"曝光的相机应用程序"控制所有人似乎都是通过后期处理来完成的。
但是,框架中似乎没有未记录的API来执行此操作。查看full headers for AVCaptureDevice.h
(通过class-dump)并注意以下方法:
- (void)setManualExposureSupportEnabled:(BOOL)arg1;
- (BOOL)isManualExposureSupportEnabled;
- (void)setExposureGain:(float)arg1;
- (float)exposureGain;
- (void)setExposureDuration:(struct { long long x1; int x2; unsigned int x3; long long x4; })arg1;
- (struct { long long x1; int x2; unsigned int x3; long long x4; })exposureDuration;
- (void)setExposureMode:(int)arg1;
- (int)exposureMode;
- (BOOL)isExposureModeSupported:(int)arg1;
我猜是gain
等效f-stop(固定光圈),duration
是快门速度。我想知道这些是否用于iPhone 5 low-light boost mode。
你也可以使用otool
来寻找并尝试拼凑符号。 exposureMode
中可能有一个新常量用于启用手动控制,而exposureDuration
似乎也有标记。在调用这些内容时,请务必使用新的-isExposureModeSupported:
并调用-respondsToSelector:
来检查兼容性。
与往常一样,Apple不赞成使用私有API,这是App Store拒绝的原因。可能有一些解决方法,例如使用-performSelector:
或obc_msgsend
隐藏使用rot13字符串或其他内容的调用,因为我非常确定他们只对应用二进制文件进行静态分析。
答案 1 :(得分:4)
我设法“欺骗”相机运行较短的曝光时间,但我怀疑它只对那些进行类似(宏)图像采集的人有用。我首先设置AVCaptureDevice以使用AVCaptureExposureModeContinuousAutoExposure并将flash设置为TorchMode。然后我解锁ForConfiguration并设置一个键值观察器来监视adjustExposure完成。然后我重新锁定设备,翻转到AVCaptureExposureModeLocked,然后关闭Torch。这具有蛮力设置比在未照明场景中相机选择的快门速度更短的效果。通过玩火炬等级,我可以设置我想要的任何相对快门速度值(当然最好让火炬开启,但在我的应用中它会对主体产生眩光)。再次,只有当物体距离非常接近(小于6英寸)时,这才真正起作用,但它允许我消除特写图像中的手抖模糊。缺点是图像较暗,因为我没有办法欺骗相机增益,但在我的特定应用中没有问题。
答案 2 :(得分:3)
看起来他们已经更新了链接文本 - 没有提及新的API曝光:
使用内置相机的强大新功能。新的API支持实时视频稳定,改进的LED闪光灯,以及人脸检测和显示。您可以获取捕获期间丢帧的报告,并利用新的实用程序将UI触摸映射到焦点和曝光命令。支持iPhone 5的应用程序可以利用低光增强模式。
是适用于iPhone 5的选择性弱光提升模式,详细here by Jim Rhoades(以及this developer forum post,需要登录)。
答案 3 :(得分:3)
作为Michael Grinich的优秀信息的后续跟踪,我发现私有API中的某些调用存在顺序依赖性。要使用“手动”曝光控制,您必须在设置模式之前启用,如下所示:
#define AVCaptureExposureModeManual 3
NSError* error = nil;
if ([captureDevice lockForConfiguration:&error]) {
captureDevice.manualExposureSupportEnabled = YES;
if ([captureDevice isExposureModeSupported:AVCaptureExposureModeManual]) {
captureDevice.exposureMode = AVCaptureExposureModeManual;
captureDevice.exposureGain = ...;
captureDevice.exposureDuration = {...};
}
[captureDevice unlockForConfiguration];
}
所有这些都在iOS-ManualCamera中得到证明。
答案 4 :(得分:1)
从iOS 8.0开始,现在终于可以了。
请参阅Apple文档中的setExposureModeCustomWithDuration等。