Wil*_*ker 27
这是使用相机找出场景有多亮的一种更简单的方法.(显然,它只读取可以在相机视野中"看到"的数据,因此它不是真正的环境光传感器...)
使用AVFoundation框架,设置视频输入,然后使用ImageIO框架,读取视频源的每一帧进入的元数据(您可以忽略实际的视频数据):
#import <ImageIO/ImageIO.h>
- (void)captureOutput:(AVCaptureOutput *)captureOutput
didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer
fromConnection:(AVCaptureConnection *)connection
{
CFDictionaryRef metadataDict = CMCopyDictionaryOfAttachments(NULL,
sampleBuffer, kCMAttachmentMode_ShouldPropagate);
NSDictionary *metadata = [[NSMutableDictionary alloc]
initWithDictionary:(__bridge NSDictionary*)metadataDict];
CFRelease(metadataDict);
NSDictionary *exifMetadata = [[metadata
objectForKey:(NSString *)kCGImagePropertyExifDictionary] mutableCopy];
float brightnessValue = [[exifMetadata
objectForKey:(NSString *)kCGImagePropertyExifBrightnessValue] floatValue];
}
Run Code Online (Sandbox Code Playgroud)
现在,您可以更新场景的亮度值(通常 - 您可以配置此值)每秒15-30次.较低的数字较暗.
接近传感器不是您应该寻找的.它是环境光传感器.显然,API没有文档或根本不可用于开发人员.检测iPhone是否处于黑暗房间的另一种方法是使用相机并获得亮度.这是一个很好的指导如何做到这一点,
http://b2cloud.com.au/tutorial/obtaining-luminosity-from-an-ios-camera/
基于Wildaker代码的Swift 4.2 版本。Xcode 10 拒绝让它成为 Float,但 double 已经起作用了。
func getBrightness(sampleBuffer: CMSampleBuffer) -> Double {
let rawMetadata = CMCopyDictionaryOfAttachments(allocator: nil, target: sampleBuffer, attachmentMode: CMAttachmentMode(kCMAttachmentMode_ShouldPropagate))
let metadata = CFDictionaryCreateMutableCopy(nil, 0, rawMetadata) as NSMutableDictionary
let exifData = metadata.value(forKey: "{Exif}") as? NSMutableDictionary
let brightnessValue : Double = exifData?[kCGImagePropertyExifBrightnessValue as String] as! Double
return brightnessValue
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
10159 次 |
| 最近记录: |