前幾天由于項(xiàng)目的需要,需要對(duì)名片的二維碼進(jìn)行掃描,獲取名片上的信息, 在掃描的過(guò)程中發(fā)現(xiàn)對(duì)有些二維碼圖像界面比較復(fù)雜時(shí), ZBarSDK 這個(gè)第三方無(wú)法掃描成功, 具體是什么原因還尚不清楚, 于是利用的原生態(tài)的二維碼API, 在iOS7 之后, 蘋(píng)果提供了一套掃描二維碼的API。
基本設(shè)置代碼如下:
- (void)scanBeginning
{
//獲取攝像設(shè)備
AVCaptureDevice * device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];
//創(chuàng)建輸入流
AVCaptureDeviceInput * input = [AVCaptureDeviceInput deviceInputWithDevice:device error:nil];
//創(chuàng)建輸出流
AVCaptureMetadataOutput * output = [[AVCaptureMetadataOutput alloc]init];
//設(shè)置代理 在主線(xiàn)程里刷新
[output setMetadataObjectsDelegate:self queue:dispatch_get_main_queue()];
//初始化鏈接對(duì)象
self.session = [[AVCaptureSession alloc]init];
//高質(zhì)量采集率
[self.session setSessionPreset:AVCaptureSessionPresetHigh];
[self.session addInput:input];
[self.session addOutput:output];
//設(shè)置掃碼支持的編碼格式(如下設(shè)置條形碼和二維碼兼容)
output.metadataObjectTypes=@[AVMetadataObjectTypeQRCode,AVMetadataObjectTypeEAN13Code, AVMetadataObjectTypeEAN8Code, AVMetadataObjectTypeCode128Code];
AVCaptureVideoPreviewLayer * layer = [AVCaptureVideoPreviewLayer layerWithSession:self.session];
layer.videoGravity=AVLayerVideoGravityResizeAspectFill;
layer.frame=self.view.layer.bounds;
[self.view.layer insertSublayer:layer atIndex:0];
// //掃描區(qū)域坐標(biāo)系轉(zhuǎn)換 不知道為什么轉(zhuǎn)換不了
// CGRect intertRect = [layer metadataOutputRectOfInterestForRect:_scanCropView.frame];
//rectOfInterest 是一個(gè) CGRect 類(lèi)型, 其值在(0,1)之間
CGFloat x = _scanCropView.frame.origin.x / CGRectGetWidth(self.view.frame);
CGFloat y = _scanCropView.frame.origin.y / CGRectGetWidth(self.view.frame);
CGFloat width = _scanCropView.frame.size.width / CGRectGetHeight(self.view.frame);
CGFloat height = _scanCropView.frame.size.height / CGRectGetHeight(self.view.frame);
output.rectOfInterest = CGRectMake(x, y, width, height);
DLog(@"______%@",NSStringFromCGRect(CGRectMake(x, y, width, height)));
//開(kāi)始捕獲
[self.session startRunning];
}
掃描的結(jié)果在代理方法里返回:
#pragma mark - Delegate
-(void)captureOutput:(AVCaptureOutput *)captureOutput didOutputMetadataObjects:(NSArray *)metadataObjects fromConnection:(AVCaptureConnection *)connection{
if (metadataObjects.count>0) {
AVMetadataMachineReadableCodeObject * metadataObject = metadataObjects.firstObject;
//輸出掃描字符串
NSString *resultStr = metadataObject.stringValue;
// 這是返回的掃描結(jié)果
DLog(@"_________%@",resultStr);
}
}
完整的 Demo已上傳到 Github: https://github.com/leo-ll/QRCode