您的位置:首页 > 移动开发 > IOS开发

iOS 原生二维码扫描(可限制扫描区域)

2016-02-19 17:45 567 查看
http://www.bubuko.com/infodetail-1142586.html

http://blog.csdn.net/lc_obj/article/details/41549469?utm_source=tuicool&utm_medium=referral

/article/2680081.html

https://github.com/lcddhr/QRWeiXinDemo

使用 AVFoundation系统库来进行二维码扫描并且限制扫描二维码的范围。(因为默认的是全屏扫描)

-(void)beginCode

{

//1.摄像头设备

AVCaptureDevice *device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];

/*

// Media types

AVMediaTypeVideo

AVMediaTypeAudio

AVMediaTypeText

AVMediaTypeClosedCaption

AVMediaTypeSubtitle

AVMediaTypeTimecode

AVMediaTypeMetadata

AVMediaTypeMuxed

*/

//2.设置输入

/**

* 设置输入 此方法需要判断 因为模拟器没有摄像头

*

* @param 把摄像头作为输入的设备

*

* @return 返回AVCaptureInput

*/

NSError *error = nil;

AVCaptureInput *input = [AVCaptureDeviceInput deviceInputWithDevice:device error:&error];

if (error) {

NSLog(@"没有摄像头%@",error);

return;

}

//3.设置输出(Metdata元数据)

AVCaptureMetadataOutput *output = [[AVCaptureMetadataOutput alloc] init];

//3.1输出的代理 捕获二维码的图像

//dispatch_get_main_queue()使用主线程队列,响应比较同步,使用其他队列响应不同步。

[output setMetadataObjectsDelegate:self queue:dispatch_get_main_queue()];

//3.2 设置扫描区域 默认是全屏扫描

//这个CGRectMake(Y,X,H,W) 1代表最大值 原点是导航右下角 为起始点

// [output setRectOfInterest:CGRectMake(0, 0.5, 0.5, 0.5)];//左上角 1/4 屏幕

// [output setRectOfInterest:CGRectMake(0.5, 0.5, 0.5, 0.5)];//左下角 1/4 屏幕

// [output setRectOfInterest:CGRectMake(0.5, 0, 0.5, 0.5)]; //右下角 1/4 屏幕

// [output setRectOfInterest:CGRectMake(0, 0, 0.5, 0.5)]; //右上角 1/4 屏幕

// [output setRectOfInterest:CGRectMake((124)/ScreenHigh, ((ScreenWidth220)/2)/ScreenWidth,220/ScreenHigh,220/ScreenWidth)]; //设置自定义像素点的 位置

[output setRectOfInterest:CGRectMake(0.25,0.25, 0.5, 0.5)]; //貌似 中间的感觉!!!

//4.拍摄会话

AVCaptureSession *session = [[AVCaptureSession alloc] init];

_session = session;

//添加session的输入和输出

[session addInput:input];

[session addOutput:output];

//4.1设置输出的格式

[output setMetadataObjectTypes:@[AVMetadataObjectTypeQRCode]];

//5.设置预览图层 (让用户看到扫描结果)

AVCaptureVideoPreviewLayer *preview = [AVCaptureVideoPreviewLayer layerWithSession:session];

_previewLayer = preview;

//5.1设置preview的属性

preview.videoGravity = AVLayerVideoGravityResizeAspectFill;

//5.2设置preview的图层的大小

[preview setFrame:self.view.bounds];

//5.3将图层添加到视图的图层

[self.view.layer insertSublayer:preview atIndex:0];

//6.启动会话

[session startRunning];

}

#pragma mark 输出的代理方法

//此方法是在识别到QRCode,并且完成转换

//如果QRCode的内容越大,转换需要的时间就越长

-(void)captureOutput:(AVCaptureOutput *)captureOutput didOutputMetadataObjects:(NSArray *)metadataObjects fromConnection:(AVCaptureConnection *)connection

{

//会频繁的扫描

//如果扫描完成就停止

[_session stopRunning];

//删除预览的图层

[_previewLayer removeFromSuperlayer];

//设置界面显示扫描结果

NSString *reslutStr = [[NSString alloc] init];

if (metadataObjects.count > 0) {

AVMetadataMachineReadableCodeObject *obj = metadataObjects[0];

reslutStr = [obj stringValue];//这个就是 扫描的结果

//如果需要对URL 名片 等信息进行扫描 再次进行扩展

}

NSLog(@"%@",metadataObjects);

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: