iOS之Scanning的实现
Posted 象棋中的象棋
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了iOS之Scanning的实现相关的知识,希望对你有一定的参考价值。
//写在最前
/*
AVFoundation原生框架的好处就是扫描特别快效率特别高,但是可能会遇到一个问题就是不知道怎么去限制扫描范围。
二维码扫描有关优秀第三方库:---- ZXing google推出的开源项目-----ZBar SDK 里面也有详细的文档
*/
引入头文件导入流媒体需要的框架
@import AVFoundation;
//遵守协议 AVCaptureMetadataOutputObjectsDelegate
@property (nonatomic,strong)AVCaptureSession *session;
@property (nonatomic,strong)AVCaptureVideoPreviewLayer *layer;
- (void)viewDidLoad {
[super viewDidLoad];
[self startRunningSession];
}
- (void)startRunningSession
// 获取 AVCaptureDevice 实例
NSError * error;
AVCaptureDevice *captureDevice = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];
[captureDevice setTorchMode:AVCaptureTorchModeOn]; //开启照明
// 初始化输入流
AVCaptureDeviceInput *input = [AVCaptureDeviceInput deviceInputWithDevice:captureDevice error:&error];
if (!input) {
NSLog(@"%@", [error localizedDescription]);
}
// 创建会话
_session = [[AVCaptureSession alloc] init];
if ([_session canAddInput:input]) {
// 添加输入流
[_session addInput:input];
}
// 初始化输出流
AVCaptureMetadataOutput *captureMetadataOutput = [[AVCaptureMetadataOutput alloc] init];
if ([_session canAddOutput:captureMetadataOutput]) {
// 添加输出流
[_session addOutput:captureMetadataOutput];
}
[captureMetadataOutput setMetadataObjectsDelegate:self queue:dispatch_get_main_queue()];
// 设置元数据类型 AVMetadataObjectTypeQRCode
[captureMetadataOutput setMetadataObjectTypes:@[AVMetadataObjectTypeQRCode]];
//value CGRectMake(0, 0, 1, 1). Metadata objects whose bounds do not intersect with the rectOfInterest will not be returned.
// [captureMetadataOutput setRectOfInterest:CGRectMake(124/667.0,100/375.0,160/667.0, 160/375.0)];
// 创建输出对象
_layer = [AVCaptureVideoPreviewLayer layerWithSession:_session];
[_layer setVideoGravity:AVLayerVideoGravityResizeAspectFill];
[_layer setFrame:CGRectMake(50, 100, 280, 280)];
[self.view.layer addSublayer:_layer];
// 开始会话
[_session startRunning];
}
#pragma - mark - AVCaptureMetadataOutputObjectsDelegate
- (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputMetadataObjects:(NSArray *)metadataObjects fromConnection:(AVCaptureConnection *)connection{
NSLog(@"-------");
if (metadataObjects && metadataObjects.count) {
AVMetadataMachineReadableCodeObject *metadataObj = [metadataObjects objectAtIndex:0];
NSString *result;
if ([[metadataObj type] isEqualToString:AVMetadataObjectTypeQRCode]) {
result = metadataObj.stringValue;
NSLog(@"result:%@",result);
} else {
NSLog(@"不是二维码");
}
[_session stopRunning];
_session = nil;
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"QRCodeInfo"
message:result
delegate:nil
cancelButtonTitle:@"cancel"
otherButtonTitles: nil];
[alert show];
}
}
//写在最后
很小的二维码,边长不到1cm,于是就修改了 sessionPreset
为 1080p 的,当时用的是ZXing, 当把图片质量改清楚时,也造成了性能的下降,基本打开扫描界面就会报memoryWarning,但是也确实解决了小二维码扫描的问题。
AVCaptureSession
可以设置 sessionPreset
属性,这个决定了视频输入每一帧图像质量的大小。
- AVCaptureSessionPreset320x240
- AVCaptureSessionPreset352x288
- AVCaptureSessionPreset640x480
- AVCaptureSessionPreset960x540
- AVCaptureSessionPreset1280x720
- AVCaptureSessionPreset1920x1080
以上列举了部分的属性值,分别代表输入图片质量大小,一般来说AVCaptureSessionPreset640x480
就够使用,但是如果要保证较小的二维码图片能快速扫描,最好设置高些,如AVCaptureSessionPreset1920x1080
(就是我们常说的1080p).
提升扫描速度和性能的就是设置解析的范围,在zbar和zxing中就是scanCrop
, AVFoundation
中设置 AVCaptureMetadataOutput
的 rectOfInterest
属性来配置解析范围。
captureOutput.rectOfInterest = CGRectMake(cropRect.origin.y/size.height, cropRect.origin.x/size.width, cropRect.size.height/size.height, cropRect.size.width/size.width);
rectOfInterest
是基于图像的大小裁剪的。
》》》此博文源于各路汇总。
以上是关于iOS之Scanning的实现的主要内容,如果未能解决你的问题,请参考以下文章
iOS BLE Scanning with (user) kill App
iOS-ARKit扫描和检测3D对象-Scanning and Detecting 3D Objects