1.原生从相册中识别二维码图片成功率低
感谢SGQRCode中提到压缩图片至手机屏幕大小再进行扫描,需要更多的参考在git中搜索SGQRCodeExample
CIDetector*detector = [CIDetector detectorOfType:CIDetectorTypeQRCode context:nil options:@{ CIDetectorAccuracy : CIDetectorAccuracyHigh }];
NSArray *features = [detector featuresInImage:[CIImage imageWithCGImage:[self imageSizeWithScreenImage:image].CGImage]];
for (int index = 0; index < [features count]; index ++)
{
CIQRCodeFeature *feature = [features objectAtIndex:index];
NSString *scannedResult = feature.messageString;
NSLog(@"result:%@",scannedResult);
}
+ (UIImage *)imageSizeWithScreenImage:(UIImage *)image {
CGFloat imageWidth = image.size.width;
CGFloat imageHeight = image.size.height;
CGFloat screenWidth = [UIScreen mainScreen].bounds.size.width;
CGFloat screenHeight = [UIScreen mainScreen].bounds.size.height;
if (imageWidth <= screenWidth && imageHeight <= screenHeight) {
return image;
}
CGFloat max = MAX(imageWidth, imageHeight);
CGFloat scale = max / (screenHeight * 2.0);
CGSize size = CGSizeMake(imageWidth / scale, imageHeight / scale);
UIGraphicsBeginImageContext(size);
[image drawInRect:CGRectMake(0, 0, size.width, size.height)];
UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return newImage;
}
2.检测光照强度根据光照强度提示用户打开闪光灯
AVCaptureVideoDataOutputSampleBufferDelegate,根据brightnessValue返回值判断光照强度
#pragma mark - - - AVCaptureVideoDataOutputSampleBufferDelegate的方法
- (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];
if (self.blockLightChange) {
self.blockLightChange(brightnessValue);
}
}